バッシュは行方不明について文句を言う] そしてそこにあります [重複]

バッシュは行方不明について文句を言う] そしてそこにあります [重複]

Bashスクリプトには次のものがあります。

echo "status: [$status] and message: [$message]"
if [ "${status}" -eq 0 && "$message" = "ERROR" ];
then
        echo "Exit 0";
        exit 0
fi

# status: [0] message: [ERROR]

thenただし、次のエラーが発生し、IEではロジックはexit 0実行されません。

line 2: [: missing `]'

閉鎖性が足りないと文句を言うようですが、]そこにあります。私がここで何を見逃しているのでしょうか?

答え1

クロージャは]実際には存在しません。

あなたは:

cmd1 with its args && cmd2 with its args

cmd2成功した場合にのみ実行されますcmd1

ここにcmd1コマンド[があり、cmd2は名前が に保存されているコマンドです$message

IOW、最初のコマンドは次のとおりです。

[ "${status}" -eq 0

結論文がありません]。 2番目の文は次のとおりです。

"$message" = "ERROR" ]

欲しい

if [ "${status}" -eq 0 ] && [ "$message" = "ERROR" ]; then...

Kornに似たシェル(bashなど)では、コマンドの代わりに[[...]]この設定を使用することもできます[。この構文は独自の構文でマイクロ言語を理解し、演算子もあります&&

if [[ $status -eq 0 && $message = ERROR ]]; then

ただし、[これとは対照的に、攻撃者が値を制御できる場合は、この脆弱性がコマンドインジェクションの脆弱性を引き起こすこと$statusに注意してください。

Bashでは、[s演算子はforのような任意の算術式で-eqはなく10進整数のみを受け入れるので問題はありません。[[...]]-eq

bash-5.0$ status='a[$(echo>&2 Gotcha)]'
bash-5.0$ [[ $status -eq 0 ]]
Gotcha

これらの問題は、(( status == 0 ))Cに似た算術式を評価する演算子にも影響します(kshでも発生します)。

bash-5.0$ (( status == 0 ))
Gotcha

¹これらの算術式にはaもありますが、算術にのみ使用されるため、&&ここでは使用できないため、文字列比較を実行できません。が必要です。((...))if (( status == 0 )) && [ "$message" = ERROR ]

答え2

直面している問題は、[テスト構成を使用していることです。この設定はkorn-shell / bash-style [[-operatorのように引数でブール演算子をサポートしていないため、[テストのみを宣言できます]

次のように2つの条件をリンクできます。&&- シェルレベル接続別のテストとして、つまり

if [ "${status}" -eq 0 ] && [ "$message" = "ERROR" ];

またはより便利な[[ ... ]]- 演算子を代わりに使用してください。

if [[ "${status}" -eq 0 && "$message" = "ERROR" ]];

関連情報