終了ステータスを返すために引用されておらず、宣言されていない変数はどの値に拡張されますか0
?
私が経験した特定の状況の例は次のとおりです。
[ -n $var ]; echo $?
0
[ -n "$var" ]; echo $?
1
var
どちらのテストも変数が宣言されていません。を使用してテストすると問題を解決できましたが-z
、引用するかどうかは明らかに違いはありません。しかし、この特別な場合にぶつかり気になり始めました。私はbashが実行するすべての拡張をより深く掘り下げたが、この動作の説明が見つかりませんでした。
一般的に私は変数を引用しますが、これらの行動の理由が引用をよりよく理解するのに役立つことを願っています。
答え1
、コマンドは状況によって異なる操作を実行するため、test
すべて同じように機能します。[
[[
どのくらいのパラメータを提供しますか?
(仕上げ単語を除く]
/ ]]
)。
- パラメータが1つあります。パラメータが空でない場合、テストは成功します。
- 引数が2つある場合、引数は単項演算子(たとえば
-n
)とオペランドとして扱われます。 - 3つのパラメータを使用すると、パラメータは1つのオペランド、2項演算子(たとえば
=
)、および別のオペランドとして扱われます。 - 引数が3つ以上
test
の場合、[
「引数が多すぎます」というエラーが発生し、[[
他のエラーが発生する可能性があります(パーサーがより複雑になります)。
[ -n $var ]
例を見て、[[
構成と比較してみましょう。[[
君がいないから噴射、変数の値がどこにあるかを知っています。var=""
与えられた[[ -n $var ]]
引数が拡張されると、bashはどの[[ -n "" ]]
項目が何であるかを明確に知ることができます。間違った。
ただし、test
andの場合は[
噴射が有効です。だから(空の文字列は消えます)[ -n $var ]
。[ -n ]
今[
議論を見てみましょう空でない文字列です。、そうですね本物。
変数を引用すると、[ -n "$var" ]
期待した誤った結果が得られます。