bashでは、代入を行うと
a=
今、何ですか? は文字列ではなく、 でもないことはa
確かです。''
0
以下のテストのみが正しいことがわかりました
if [ $a = ];then echo 'good';fi
答え1
空の文字列です。
これは以下を実行するのと同じです:
a=''
または
a=""
または
a=$''
あるいは、それに関して言えば:
a=''""$''
''
、、""
は$'...'
シェルへの引用演算子です。次のようにすると、
a=''
2 つの一重引用符で構成された文字列ではなく、$a
空の文字列を割り当てています。''
これらは内部に何も含まれていないため不要ですが、これによりコードが少し読みやすくなります (空の文字列を割り当てる意図があったことが明確になります)。
''
にリテラルを割り当てるには$a
、次のように特殊文字を引用符で囲む必要があります。
a="''" a=\'\' a=$'\'\'' a="'"\'
テストコマンドが無効です。
[ $a = ]
を引用符で囲み忘れたため$a
、split+glob 演算子が に適用されます$a
。 は空なので(ただし、 のデフォルト値で空白または改行のみが含まれていた場合も同じです)、コマンドに渡される引数はなく$a
なります。$IFS
[
[
したがって、が受け取る引数はすべて[
、=
、です]
。 の場合、これは が空でない文字列である[
かどうかを判定するテストであり、 true を返します。=
ここで必要なのは、これらの引数を[
コマンドに渡すことです。
[
$a
必要なコンテンツ"$a"
=
- 空の文字列。 または が必要
''
です""
... 何も渡さないと、引数が渡されないことになり[
、4 番目の引数が閉じになります]
。 ]
つまり次のようになります:
if [ "$a" = '' ]; then echo '$a is empty'; fi
または:
if [ -z "$a" ]; then echo '$a is empty'; fi
答え2
変数 a は空の文字列に等しくなります。
a=
if [ "$a" -eq "" ]; then echo 'good'; fi
出力は次のとおりです。
$ . tst.sh
good
このコードの場合:
a=
if [ -z "$a" ]; then echo 'good'; fi
出力は同じです。