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" ]];