これはシェル(bash、ダッシュ)プロンプトで機能します。
[ -z "" ] && echo A || echo B
A
しかし、文章を書こうとしています。POSIXシェルスクリプトは次のように始まります。
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
なぜかわかりませんが、メッセージを受信していません:
指定された引数が空です。
次のようにスクリプトを呼び出すと:
./test_empty_argument ""
なぜそんなことですか?
ベストアンサー1
セリフに注意してください
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
これは以下に関連しています。
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."
exit 1
(;
ほとんどの場合、引用符のない部分は改行で置き換えることができます。)
つまり、exit 1
スクリプトに渡されたパラメーターの数に関係なく、ステートメントは常に実行されます。これは、メッセージをThe given argument is empty.
印刷する機会がまったくないことを意味します。
テスト後に複数のステートメントを実行するために「段落構文」を使用するには{ ...; }
。if
if [ "$#" -ne 1 ]; then
echo 'Invalid number of arguments, expected one.' >&2
exit 1
fi
2回目のテストにも同じ問題があります。
~について
[ -z "" ] && echo A || echo B
これは与えられた例ではうまくいきますが、一般的です。
some-test && command1 || command2
会議いいえそして
if some-test; then
command1
else
command2
fi
代わりにもっと似ています。
if ! { some-test && command1; }; then
command2
fi
または
if some-test && command1; then
:
else
command2
fi
つまり、テストまたは最初のコマンドが失敗した場合、2番目のコマンドが実行されます。つまり、実行される可能性があることを意味します。3つすべてスピーチが含まれています。