フラグやその他の条件を確認する簡単なスクリプトを実行しようとしています。フラグの値にかかわらず、以下は常に「Run script..」をエコーします。
FLAG_Control=false
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
これは期待どおりに機能しますが:
FLAG_Control=false
if [ $FLAG_Control = true ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
これは明示的な比較をしなければならないことを意味しますか?私が最初に何か間違っているのでしょうか?
答え1
を試してくださいif $FLAG_Control && [ -d /path/to/dir ]; ...
。角括弧はif
;構文の一部ではありません。この場合、コマンド(または)$FLAG_Control
として解釈されることを望み、これは他の句とうまく機能します。 (これは変数が常にまたはに設定されていると仮定します。)true
false
&&
[ ... ]
true
false
初期テストが期待どおりに行われなかった理由は、次のtest
文書で確認できます[
。
-n STRING
the length of STRING is nonzero
STRING equivalent to -n STRING
ここには特別な意味がないのでfalse
、ただ空でない文字列として扱われ、真理値と解釈されます。
答え2
私はここ数ヶ月でbashスクリプトを学びました。私が知っている限り、bashにはブール変数はありません。しかし、ブール値がないという意味ではありません。
If/then は 1 または 0 を探します。今…注意事項があります。 0 は true、残りはすべて false です。たとえば、aが直接存在することを確認すると、1ではなく0が返されます。
呼び出した関数に何らかのエラーコードが表示されたら、そのエラーをキャッチできます。
したがって、次のことを試してください。
FLAG_Control=1
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
答え3
aに最も近いもの本物シェル変数の値は次のとおりです。置く値。ここに依存するいくつかの基本パラメータ属性もあります。たとえば、
FLAG=
[ -d "${FLAG:+$HOME}" ] || ! echo \
either \$HOME is not a directory or \$FLAG is null or unset
上記は、null以外の場合にのみ条件付きで$FLAG
値に拡張されます。$HOME
これにはいくつかのバリエーションがありますが、一般的なポイントは、パラメータの値がパラメータの存在と同じくらい重要ではないということです。持つ価値。FLAG
上記のいずれかの値に設定すると、test
失敗ではなく実際の戻りが発生します。