Linuxの単純なフラグベースの比較

Linuxの単純なフラグベースの比較

フラグやその他の条件を確認する簡単なスクリプトを実行しようとしています。フラグの値にかかわらず、以下は常に「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として解釈されることを望み、これは他の句とうまく機能します。 (これは変数が常にまたはに設定されていると仮定します。)truefalse&&[ ... ]truefalse

初期テストが期待どおりに行われなかった理由は、次の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失敗ではなく実際の戻りが発生します。

関連情報