Bash変数の深さがあり、それが0に等しいかどうかをテストしたいのですが、そうであれば、スクリプトの実行を中止したいです。これまでのところ私は持っています:
zero=0;
if [ $depth -eq $zero ]; then
echo "false";
exit;
fi
残念ながら、これは次のことにつながります。
[: -eq: unary operator expected
(翻訳により多少不正確かもしれません)
どうやって動かせるようにスクリプトを修正すればいいの?
depth
変数が設定されていないようです。これは、bashが変数の値を式に代入した後に、式[ $depth -eq $zero ]
が[ -eq 0 ]
になることを意味します。ここでの問題は、-eq
演算子が1つの引数(ゼロ)のみを持つ演算子として誤って使用されていることですが、2つの引数が必要です。そのため、単項演算子エラーメッセージが表示されます。
編集: として ドクトルJ この回答に対する彼のコメントで述べたように、チェックで未設定の変数に関する問題を回避する安全な方法は、変数を""
で囲むことです。説明は彼のコメントを見てください。
if [ "$depth" -eq "0" ]; then
echo "false";
exit;
fi
[
コマンドで使用されている未設定の変数は、bashにとって空のように見えます。 true
は空または設定解除されているため、以下のテストをすべて使用してxyz
と評価されるので、これを検証できます。
if [ -z ] ; then echo "true"; else echo "false"; fi
xyz=""; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
unset xyz; if [ -z "$xyz" ] ; then echo "true"; else echo "false"; fi
二重括弧(( ... ))
は算術演算に使用されます。
二重角括弧[[ ... ]]
は、次の演算子とともに、数値の比較と検証に使用できます(整数のみサポートされています)。
· NUM1 -eq NUM2 returns true if NUM1 and NUM2 are numerically equal.
· NUM1 -ne NUM2 returns true if NUM1 and NUM2 are not numerically equal.
· NUM1 -gt NUM2 returns true if NUM1 is greater than NUM2.
· NUM1 -ge NUM2 returns true if NUM1 is greater than or equal to NUM2.
· NUM1 -lt NUM2 returns true if NUM1 is less than NUM2.
· NUM1 -le NUM2 returns true if NUM1 is less than or equal to NUM2.
例えば
if [[ $age > 21 ]] # bad, > is a string comparison operator
if [ $age > 21 ] # bad, > is a redirection operator
if [[ $age -gt 21 ]] # okay, but fails if $age is not numeric
if (( $age > 21 )) # best, $ on age is optional
試してください:
zero=0;
if [[ $depth -eq $zero ]]; then
echo "false";
exit;
fi
このフォーマットを使用して、 '==' '<='のような比較演算子を使用することもできます。
if (( $total == 0 )); then
echo "No results for ${1}"
return
fi
具体的には((depth))
。例として、以下は1
を出力します。
declare -i x=0
((x)) && echo $x
x=1
((x)) && echo $x
これを試すことができます:
: ${depth?"Error Message"} ## when your depth variable is not even declared or is unset.
注:これはdepth
の後の?
です。
または
: ${depth:?"Error Message"} ## when your depth variable is declared but is null like: "depth=".
注:これはdepth
の後の:?
です。
ここで変数depth
がnull
で見つかった場合、エラーメッセージを表示して終了します。