web-dev-qa-db-ja.com

bash変数が0に等しいかどうかを確認

Bash変数の深さがあり、それが0に等しいかどうかをテストしたいのですが、そうであれば、スクリプトの実行を中止したいです。これまでのところ私は持っています:

zero=0;

if [ $depth -eq $zero ]; then
    echo "false";
    exit;
fi

残念ながら、これは次のことにつながります。

 [: -eq: unary operator expected

(翻訳により多少不正確かもしれません)

どうやって動かせるようにスクリプトを修正すればい​​いの?

146
Perlnika

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
142
cyon

二重括弧(( ... ))は算術演算に使用されます。

二重角括弧[[ ... ]]は、次の演算子とともに、数値の比較と検証に使用できます(整数のみサポートされています)。

· 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
55
Raviteja Gubba

試してください:

zero=0;

if [[ $depth -eq $zero ]]; then
  echo "false";
  exit;
fi
18
Jacek Dominiak

このフォーマットを使用して、 '==' '<='のような比較演算子を使用することもできます。

  if (( $total == 0 )); then
      echo "No results for ${1}"
      return
  fi
13
Gurubaran

具体的には((depth))。例として、以下は1を出力します。

declare -i x=0
((x)) && echo $x

x=1
((x)) && echo $x
4

これを試すことができます:

: ${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の後の:?です。

ここで変数depthnullで見つかった場合、エラーメッセージを表示して終了します。

2