これら2つの同様のコマンドバリアントが異なる出力を提供するのはなぜですか?

これら2つの同様のコマンドバリアントが異なる出力を提供するのはなぜですか?

コマンド1:

$ rm hello.txt 2>/dev/null || { echo “Couldn’t delete hello.txt” }
"Couldn't delete hello.txt"

コマンド2

$ rm hello.txt 2>/dev/null || { echo 'Couldn’t delete hello.txt' }
Couldn't delete hello.txt

メモ: hello.txt現在のディレクトリには存在しません。

答え1

最初のコマンド

rm hello.txt 2>/dev/null || { echo “Couldn’t delete hello.txt” }

<U+201C>(左二重引用符)、<U+2019>(右一重引用符)、および(右二重引用符)文字を含みます。これらの文字<U+201D>はシェルについて特別な内容がなく、そのまま出力されます。

2番目の順序

rm hello.txt 2>/dev/null || { echo 'Couldn’t delete hello.txt' }

一重引用符で囲まれた文字列を含みます。との間nの文字はシェルに特別ではありません。t<U+2019>

答え2

このペア“”スマート見積。同様に、あなたのinはCouldn’t賢明な引用です。

一般的な名言とは違うのでカール引用された部分の始まりと終わりを区別してください。すべてではなくても、ほとんどのプログラミング/スクリプト言語では意味がありません。他のUnicode文字と同じように動作することを知っています。

したがって、最初のエントリにはecho実際に参照がなく、コマンドは次の単語を受け取ります。別のパラメータとして。簡単に確認できます。

$ for s in “Couldn’t delete hello.txt”; do echo $s; done
“Couldn’t
delete
hello.txt”

$ for s in 'Couldn’t delete hello.txt'; do echo $s; done
Couldn’t delete hello.txt

実際に出力が無効です(実際にコピーして貼り付けましたか?)丸い引用符があるので、出力echoは上記の例のようにまだ丸い引用符でなければなりません。

ご覧のとおり、2番目のケースは一つ文字列にASCIIの範囲外のUnicode文字が含まれているため、引用符はシェルから削除されます。

バラより二重引用符は何ですか?私のコードで使用できますか?

関連情報