次のようなifステートメントがあるとします。
if [ $(false) ]; then
echo "?"
fi
これにより、「?」は印刷されません(条件が偽です)。ところで、次のような場合には「?!」が出力されますが、なぜでしょうか。
if [ $(false) -o $(false) ]; then
echo "?!"
fi
ベストアンサー1
$(false)
falseと評価されず、空の文字列を生成します。引用がないので、
if [ $(false) ]; then
次のように評価
if [ ]; then
[
空の式は偽なので、これは偽です。
if [ $(false) -o $(false) ]; then
次のように評価
if [ -o ]; then
これいいえ-o
演算子を使用すると、-o
単一の文字列を含む式で評価されます。[
これらの式はtrueなので、then
ステートメントの一部がif
実行されます。
バラよりPOSIX仕様test
、特に:
演算子の優先順位と生成される戻り値を決定するために使用されるアルゴリズムは、テストする引数の数に基づいています。 (ただし、「[...]」形式を使用する場合は、最後のパラメータ<右角括弧>をアルゴリズムに含めないでください。)
次のリストでは、$ 1、$ 2、$ 3、および$ 4はテストするパラメータを示しています。
引数 0 個:
false(1) を終了します。
パラメータ1:
$ 1がnullでない場合はtrue(0)を返し、そうでない場合はfalseを返します。
test
演算子は、2つ以上の引数が指定されている場合にのみ考慮されます。
コマンドの終了ステータスを条件として使用するには、コマンドの置き換えまたは次の項目に入れないでください[ ]
。
if false; then
そして
if false || false; then
また参考にしてくださいtest
-a
演算子は-o
廃止され、信頼できません。;シェルの&&
AND||
演算子を使用する必要があります。例えば
if [ "$a" = b ] || [ "$a" = c ]; then