空の変数があります。私は二重引用符をエスケープするときの動作が異なります
if [[ -z "$value" ]]; then echo "hello"; fi
を行うと、私は二重引用符をエスケープするときの出力は、しかし、ハロー
である、すなわち
if [[ -z \"$value\" ]]; then echo "hello"; fi
ハローが画面に印刷されていません。
上記の2つのコマンドの違いは何ですか?
空の変数があります。私は二重引用符をエスケープするときの動作が異なります
if [[ -z "$value" ]]; then echo "hello"; fi
を行うと、私は二重引用符をエスケープするときの出力は、しかし、ハロー
である、すなわち
if [[ -z \"$value\" ]]; then echo "hello"; fi
ハローが画面に印刷されていません。
上記の2つのコマンドの違いは何ですか?
これは、最初のステートメントで変数が展開され、結果のステートメントがnullであるためです。
2番目には""
に拡大されます。違いを見るには、2つのエコーステートメントを考慮してください。
$ echo "$value"
$ echo \"$value\"
""
最初のものは2番目のものではありません。
よく説明されています –
if [[ -z "$value" ]]; then echo "hello"; fi
は、変数$value
の文字列値が空でないかどうかをチェックします。しかし、if [[ -z \"$value\" ]]; then echo "hello"; fi
($value
が空白を含まないと仮定)は、"
で始まり、"
で終わる文字列が空でないかどうかをチェックします。しかし、それは常に少なくとも2文字を含んでいるので決してありません。
シェルには3種類の引用符があります。
シングルクオート(」「)
これらの引用符の間のすべての特殊文字は、その特別な意味を失います。
のでecho '$VALUE'
$は、単一引用符の内側にその特別な意味 を失うので、文字通り$VALUE
を印刷します。
二重引用符(」「)これらの引用符の間
ほとんどの特殊文字は、とりわけ、$のようないくつかの例外を除いて、その特別な意味を失います。先頭
値動き()
バック引用符の間に何がコマンドとして扱われることになると実行されるであろう。
バックスラッシュ
直後にバックスラッシュを以下の任意の文字は、その特別な意味を失います。あなたのケースで非常に
あなたはので、バックスラッシュ、二重引用符の\"$value\"
を言うときの意味を失うことになるし、それがあるとして評価されます。
たとえば、value=34
がある場合、\"$value\"
は二重引用符で"34"
と評価されます。あなたの場合のように値がnullの場合、\"$value\"
は""
と評価されますので、nullではなく、二重引用符で囲まれた文字列であるため、ヌルチェックに失敗します。
バックスラッシュは? 2番目の引数は二重引用符を渡し、それに続けて空と空の文字列ではない二重引用符を引数として渡します。最初は空の文字列を渡します。引用符は削除され、空文字列は空文字列になります。 –
使用しているシェルを示すタグを追加してください。私はbashを推測していますが、私は推測したくありません。 –
引用符をエスケープすると、構文上(他のデータを理解する方法をシェルに指示する)からリテラル(データ自体)に変更されます。引用符自体をデータとして渡すので、テストの引数として与えられたデータは決してnullになることはありません。 –