ShellプログラミングBash引用符の件

3922 ワード

まず、bashスクリプトには三つの引用符があります。
1.単引用符
2.二重引用符「
3.クォーテーションマーク`
単引用符
        二つのカギカッコが囲む文字列は普通の文字列で、元の文字どおりの意味を残します。
二重引用符
        二つの二重引用符が囲む文字列は、一部の特殊文字がその役割を果たします。
        これらの特殊文字は、ドル符$  感嘆符
アンチ?クォーテーションマーク
        二つの反引用符で囲まれた文字列をコマンドとして実行します。
        実行された出力結果は、その逆引用符の内容としてコマンド置換と呼ばれ、
        これはもう一つのもっといい書き方があります。
いくつかの例を見て、この三つの引用符の特性をより直接的に理解します。
1.ドル符の単項、二重引用符の表現:二重引用符の中のドルは変数参照が発生し、単元引用符の中のドルは文字どおりの意味を保持します。

igi@gentoo ~ $ echo '$HOME'
$HOME
igi@gentoo ~ $ echo "$HOME"
/home/igi
注:HOMEは内部変数です。
2.反斜め棒\単、二重引用符の表現:二重引用符の中の\は、その後ろの文字に意味を変えて、特殊な意味を持たせたり、元の特殊な意味を失わせたりします。単引用符の中の\は、文字どおりの意味を残します。

igi@gentoo ~ $ echo '\$HOME'
\$HOME
igi@gentoo ~ $ echo "\$HOME"
$HOME
注:二重引用符の中の\、後に付いて$ここで転義が発生しました。$は特殊な意味を失い、普通の文字になります。
3.反引用符と他の2つの引用符の違い:反引用符で囲まれた文字列が実行され、結果をとります。

igi@gentoo ~ $ echo 'date'
date
igi@gentoo ~ $ echo "date"
date
igi@gentoo ~ $ echo `date`
Fri Dec 3 18:34:09 CST 2010
注:反引用符におけるdateはコマンド実行として扱われ、コマンドの出力情報が含まれています。
彼らの違いを知りました。よくある問題について話しましょう。
1.逆引用符を単引用符と書く。
これらは確かに似ていると言わざるを得ません。一部の本の印刷字体の違いが高くないか、印刷の品質がよくないため、多くの新米が間違いを起こしてしまいました。もしバックボーンがどこにあるか分からないなら、Escボタンの下のボタンを見てください。それはバックボーンです。もちろん、本を読んで注意しない人もいます。これもよくあることです。引用符と単引用符の役割の違いが分かりさえすれば、いつ単引用符を使いますか?いつ反引用符を使うべきですか?文字列が必要な場合は、シングルクォーテーションマークを使います。コマンドの出力をキャプチャーする必要がある場合は、バックル記号を使ってください。
2.二重引用符をつけるのを忘れてしまいました。
ダブルクォーテーションはいつも無駄ではなく、それに囲まれたデータは非常に安全になります。

igi@gentoo ~ $ seq 3
1
2
3
igi@gentoo ~ $ echo `seq 3`
1 2 3
igi@gentoo ~ $ echo "`seq 3`"
1
2
3
注:seqは改行を含む情報を出力しますが、echo`seq 3`は改行符を失いました。Bashは解析時に‘seq 3`の出力結果は3つの独立した文字だと思っています。解析後はecho 1 2 3と同じです。また、echo‘seq 3`’の場合は、bashは‘seq 3’の出力結果を一つの全体として扱う(二重引用符で囲まれているため)ので、出力の結果はbashによって分割されず、改行は保留される。したがって、変数やコマンドの交換の完全な情報を保持したい場合、特に改行符の場合は、ダブルクォーテーションマークを付けて保険にかけてください。いつもダブルクォーテーションマークをつけるのはいい習慣です。先に説明しましたが、引用符には魔法がなく、変数もなくなりました。コマンドの交換もできませんでした。もう一度注意します。「var」、「command`」は全部$varより安全です。多くの場合、前の方が結果が必要です。あなたが何をしているかを知っていない限り、双引用符を簡単に省略しないでください。
3.引用符ネストはいつも混乱します。
引用符には他の引用符が含まれていますが、単引用符と二重引用符の文字の表現を理解すれば、分かりやすくなります。

igi@gentoo ~ $ echo "abc\"abc"
abc"abc
igi@gentoo ~ $ echo "abc\'abc"
abc'abc
igi@gentoo ~ $ echo "abc\`abc"
abc`abc
あなたが見ているように、二重引用符には他の引用符を入れるのが簡単です。ただ、バックスラッシュを使います。引用符の中ではこのように簡単ですか?

igi@gentoo ~ $ echo 'abc"abc'
abc"abc
igi@gentoo ~ $ echo 'abc`abc'
abc`abc
ここに来ると、確かに簡単です。シングルクォーテーションマークは普通の文字ですので、意味を変える必要はありません。もしバックスラッシュを追加したら、バックスラッシュは相変わらず自分で印刷します。

igi@gentoo ~ $ echo 'abc\"\`abc'
abc\"\`abc
問題が来ました。シングルクォーテーションマークにはどうやってシングルクォーテーションマークが含まれていますか?この時、バックスラッシュ\も不要です。直接にシングルクォーテーションマークを書くと、バックラッシュはまだ終わっていないと思います。はい、もしあなたが不幸にもこのような問題にぶつかったら、解決する方法があります。

igi@gentoo ~ $ echo $'abc\'abc'
abc'abc
igi@gentoo ~ $ echo -e 'abc\x27abc'
abc'abc
igi@gentoo ~ $ echo 'abc'\''abc'
abc'abc
第一の方法はbash特有の、'string'の間からバックスラッシュまでの間に意味文字を変換し、第二の方法はシングル引用符のASCIIコードでシングル引用符を印刷しますが、第三の方法は、カットオフコマンドによって中間にシングル引用符を挿入して実現します。普通は最初の方法で一番優雅です。
最後に、もっと多くの人にBashを好きになってほしいです。Bashを使います。