217

bash変数の深さがあり、それが0に等しいかどうかをテストしたいと思います。そうであれば、スクリプトの実行を停止したいと思います。これまでのところ:

zero=0;

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

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

 [: -eq: unary operator expected

(翻訳のために少し不正確になる可能性があります)

スクリプトを変更して機能させるにはどうすればよいですか?

4

6 に答える 6

233

depth変数が設定されていないようです。これは、bashが変数の値を式に代入した後に式[ $depth -eq $zero ]がなることを意味します。[ -eq 0 ]ここでの問題は、-eq演算子が1つの引数(ゼロ)しかない演算子として誤って使用されていることですが、2つの引数が必要です。そのため、単項演算子のエラーメッセージが表示されます。

編集:Doktor 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
于 2012-10-26T11:36:09.433 に答える
70

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

次の演算子を使用して、二重角かっこ[[ ... ]]を使用して数値を比較および調べることができます(整数のみがサポートされています)。

· 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
于 2012-10-26T11:57:28.860 に答える
24

試す:

zero=0;

if [[ $depth -eq $zero ]]; then
  echo "false";
  exit;
fi
于 2012-10-26T11:37:17.983 に答える
6

具体的には: ((depth)). 例として、次のように出力し1ます。

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

x=1
((x)) && echo $x
于 2016-06-10T23:10:54.333 に答える
3

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

: ${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た場合、エラー メッセージを出力して終了します。

于 2014-07-03T09:53:50.827 に答える