2017-06-12 4 views
0

未設定の変数が0と評価される理由を理解しようとしています。一部のスクリプトでは、変数の書き込みは、必要な場合にのみ設定されます。 。 このような振る舞いは正しくない出力になります。 私はすべての変数をプリセットする必要がありますか、または少なくともそれらが設定されていることを確認する必要がありますか? OKとステートメント

#!/bin/bash 
#myvalue=0 #comment to simulate an unset variable. 

if [[ $myvalue -eq 0 ]] ; then 
    echo "OK" 
fi 

結果:[[ ... ]]内部

bash -x test.sh 
+ [[ '' -eq 0 ]] 
+ echo OK 
OK 
+0

を試してください[if [$ myvalue -eq 0]; then' –

+0

[]だけで-eqを使うことはできません。私は数字を評価する必要があるので使用します。 –

+1

もちろん、 '-eq'を' [';実際に '[[... -eq ...]]'を使うべきかどうかは議論の余地があります。なぜなら、はるかに読みやすい '((... == ...))'を使うことができるからです。 – chepner

答えて

3

-eqオペレータ、それが唯一の値を整数に適用されるので、そのオペランドの算術評価をトリガします。 0算術評価のより明確なデモンストレーションに算術式では、未設定の変数のデフォルト:あなたの例では、あなたも、最初のパラメータを拡張する必要がないこと

$ if [[ 3 -eq "1 + 2" ]]; then echo equal; fi 
equal 

注意。算術評価はあなたのためにそれを行います。

$ if [[ myvalue -eq 0 ]]; then echo equal; fi 
equal 
$ myvalue=3 
$ if [[ myvalue -eq 3 ]]; then echo equal; fi 
equal 

はまた、これはbash[[ ... ]]コマンドに固有のものです。 POSIX [の場合、-eqは算術評価をトリガーしません。

$ if [ "$myvalue" -eq 0 ]; then echo equal; fi 
bash: [: : integer expression expected 
$ if [ myvalue -eq 0 ]; then echo equal; fi 
bash: [: myvalue: integer expression expected 
+0

私はあなたが「算術式では、未設定の変数のデフォルトは0」と書いていたようです。私はそれを知りませんでした。また、人間のbashでそのような情報を探していたが、それを見つけることができませんでした。 –

+0

マニュアルページのARITHMETIC EVALUATIONセクションには、「nullまたはunsetのシェル変数が、パラメータ 拡張構文を使用せずに名前で参照されると0に評価されます」という文があります。私の知る限りでは、数値比較演算子が算術評価をトリガーするという事実は、実際には文書化されていません。 – chepner

+0

( '$ myvalue'は' myvalue'だけでなく、 'myvalue'だけでなく、' $ [myvalue']の意図しない副作用が '[[.. .. 。]] ')。 – chepner

0

リテラル値ではなく-eqの比較使用=になりたい場合。 $myvalueは、0に設定されているか否か、まったく設定されている

if [[ $myvalue = 0 ]] ; then 
    echo "OK" 
fi 

ARG1が0に等しい場合、演算バイナリ演算子(-eq)がtrueを返し、... ''はゼロに等しい、ヌルです。

関連する問題