
bash スクリプトでテキスト ファイルを作成しようとしました。
コマンドecho
は複数行にまたがっており、二重引用符 "" がいくつかあります。
#!/bin/bash
echo "blabla bla bla bla "blabla"
bla bla " bla bla bla"
and so on and so on
bla bla
blu bla "bla bla bla "
bla bla" > /root/bin/bla
echo
コマンド内に望ましくない二重引用符 "" が多数あります。
そして私は
#!/bin/bash
echo 'blabla bla bla bla "blabla"
bla bla " bla bla bla"
and so on and so on
bla bla
blu bla "bla bla bla "
bla bla' > /root/bin/bla
二重引用符「"」と一重引用符「'」に何か違いがあるのだろうか?
どちらが優先順位が高いのでしょうか? 見た目が違うだけなのでしょうか?
答え1
からbash マニュアル:
3.1.2.2 一重引用符
文字を一重引用符 (''') で囲むと、引用符内の各文字のリテラル値が保持されます。一重引用符は、その前にバックスラッシュがあっても、一重引用符の間に出現することはできません。
3.1.2.3 二重引用符
文字を二重引用符 ('"') で囲むと、'$'、'`'、'\'、および履歴拡張が有効になっている場合の '!' を除く、引用符内のすべての文字のリテラル値が保持されます。文字 '$' および '`' は、二重引用符内でも特別な意味を保持します (シェル拡張を参照)。バックスラッシュは、'$'、'`'、'"'、'\'、または改行のいずれかの文字が続く場合にのみ、特別な意味を保持します。二重引用符内では、これらの文字のいずれかが続くバックスラッシュは削除されます。特別な意味を持たない文字の前のバックスラッシュは変更されません。二重引用符の前にバックスラッシュを付けると、二重引用符を二重引用符内で引用できます。有効になっている場合、二重引用符内の '!' がバックスラッシュを使用してエスケープされない限り、履歴拡張が実行されます。'!' の前のバックスラッシュは削除されません。特殊パラメータ '*' と '@' は、二重引用符で囲むと特別な意味を持ちます (シェルパラメータの展開を参照)。
上記の実際のデモンストレーションを以下に示します。
- 二重引用符を使用するとパラメータ展開の評価が可能になりますが、一重引用符では不可能です。
$ var=foo
$ echo "$var"
foo
$ echo '$var'
$var
- 二重引用符ではバックスラッシュ エスケープの評価が許可されますが、一重引用符では許可されません。
$ echo "\\"
\
$ echo '\\'
\\
- 二重引用符を使用するとコマンド置換 (
$(
、`
) の評価が可能になりますが、一重引用符ではできません。
$ echo "$(echo bar)"
bar
$ echo '$(echo bar)'
$(echo bar)