sh
スクリプティングの主要なポイントの1つは移植性(プログラムの接続ではなく、プログラムの置き換えではない)であるため、私は常にBash拡張機能を使用する代わりにPOSIX を使用するようにしています。
ではsh
、「is-prefix」条件をチェックする簡単な方法があります。
case $HOST in node*)
# Your code here
esac
何歳を考えると、難解とcrufty shがある(とバッシュは治療ではありません:それは、より少ない一貫性の少ないポータブル、複雑です)、私は非常に素晴らしい機能面を指摘したいと思います:いくつかのシンタックス要素が好きながらcase
、内蔵されています、結果の構成は他のジョブと何の違いもありません。同じ方法で構成できます。
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
またはもっと短い
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
またはさらに短くする(!
言語要素として提示するためだけに-これは現在悪いスタイルです)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
明示的にしたい場合は、独自の言語要素を作成します。
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
これは実際にはかなりいいですね。
if beginswith node "$HOST"; then
# Your code here
fi
そして、sh
基本的にはジョブと文字列リスト(そしてジョブが構成される内部プロセス)だけなので、簡単な関数型プログラミングも実行できます。
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
これはエレガントです。私がsh
深刻なものに使用することを提唱しているわけではありません-現実世界の要件であまりにも速く壊れます(ラムダがないため、文字列を使用する必要があります。ただし、関数呼び出しを文字列でネストすることはできません。パイプは不可能です)。