4

次の 2 つのブール式は同じですか?

if [ -n $1 ] ; then   
if [ -n "$1" ] ; then

そしてこの二人

if [ $? == 0 ] ; then
if [ "$?" == 0 ] ; then

そうでない場合 - 変数を引用符で囲む必要があるのはいつですか?

4

3 に答える 3

8

コマンドを使用すると[(はい、それはコマンドです)、ほとんどの場合、引用符を使用する必要があります。例外は非常にまれなので、私はそれらに入ることができないかもしれません。例えば、

set -- 'x -a -z b'
if [ -n $1 ]; then echo foo; fi
# … crickets
if [ -n "$1" ]; then echo foo; fi
foo

Bashには[[キーワードもあります(そうです、それはキーワードです)。これは、拡張について知り、引用しないという罠を回避するのに十分賢いです。[[(ただし、通常は式内で引用しても安全です。)

この[コマンドはPOSIXに準拠して[[おり、バシズムであるため、どちらをいつ使用するかを決定します。

2番目の例として、何かを数値と比較する場合、使用する==のはバシズムです。bash用に作成している場合は、次のような算術式を使用します。

if (( $? == 0 )); then …

ただし、POSIXに準拠しようとしている場合は、それを記述してください

if [ "$?" = 0 ]; then …

$?多くの場合、コマンドの成功/失敗を比較することは正確に何をするのかという理由で、との直接比較は危険信号ifです。

if somecommand; then …

よりも良い

somecommand
if (( $? == 0 )); then …

ただし、これを使用する必要がある場合$?は、例外のようなものです。これは、1バイトの符号なし整数であることが保証されているため、引用符を付けても問題はありませんが、引用符で囲まれていないものを使用するのはかなり安全です。

$ false; if [ $? = 0 ]; then echo t; else echo f; fi
f
$ true; if [ $? = 0 ]; then echo t; else echo f; fi
t
$ false; if [ "$?" = 0 ]; then echo t; else echo f; fi
f
$ true; if [ "$?" = 0 ]; then echo t; else echo f; fi
t
$ false; if [ $? == 0 ]; then echo t; else echo f; fi
f
$ true; if [ $? == 0 ]; then echo t; else echo f; fi
t
$ false; if [ "$?" == 0 ]; then echo t; else echo f; fi
f
$ true; if [ "$?" == 0 ]; then echo t; else echo f; fi
t
于 2012-08-30T18:11:39.520 に答える
8

値に空白が含まれる可能性がある場合、または一般に連続した文字列ではない可能性がある場合は、変数を引用符で囲みます。そう

常に 0 から 255 の間で$?ある必要があります。これは、各サブプロセスが戻った後に設定される戻り値であるため、引用する必要はありません。文字列値を直接割り当てることによってそれを破ることはできません。

$?=Is of course wrong and should be

 ?=Bad value assigment

ユーザー変数名は [A-Za-z_] で始まる必要があるため、そうしないでください ;-)

一方、$1 の場合、次のように値が渡された場合

myscript "arg1 with spaces"

テスト

if [ -n $1 ] ; then

爆発します、

しかし、テスト

if [ -n "$1" ] ; then  

成功します。

IHTH

于 2012-08-30T18:02:28.113 に答える
4

それらは常に同じではありません。問題の変数が空であるか、空白が含まれている場合、[コマンド ( のエイリアスtest) の引数が少なすぎるか多すぎる可能性があります。

では、条件を評価する前に変数を単語に分割しないbash組み込みの条件構文を使用できます。つまり、二重引用符は必要ありません。[[ -n $1 ]]

于 2012-08-30T18:05:39.237 に答える