定義された文字列変数をプログラミング言語の言語bash
に渡すには、二重引用符を保持する必要があります。Scheme
私の質問は、他の一重引用符セット内に二重引用符が残っているのはなぜですか?これを説明するためにいくつかの例を見てみましょうbash command prompt
。
$ str1=hey
$ echo $str1
hey
$ str2="hey"
$ echo $str2
hey
$ str3='hey'
$ echo $str3
hey
$ str4='"hey"'
$ echo $str4
"hey"
$ str5="'hey'"
$ echo $str5
'hey'
$
答え1
一重引用符で囲まれた文字列は、文字列をリテラルとして保持します。二重引用符で囲まれた文字列は、変数の補間と拡張によって文字列を保存します。 Bashのマニュアルページでこれについて説明します。 QUOTINGセクションを参照してください。
引用メカニズムには、エスケープ文字、一重引用符、二重引用符の3つがあります。
引用符のないバックスラッシュ(\)はエスケープ文字です。 {newline} を除いて、次の文字のリテラル値を保持します。 \{newline} ペアが発生してバックスラッシュ自体が引用されない場合、\{newline} は行連続で処理されます (つまり、入力ストリームから削除され、事実上無視されます)。
文字を一重引用符で囲むと、引用符内の各文字のリテラル値が保持されます。前にバックスラッシュがある場合でも、一重引用符の間に一重引用符を使用することはできません。
文字を二重引用符で囲むと、履歴拡張が有効になっている場合は、$、`、\、!を除く引用符内のすべての文字のリテラル値が保持されます。 $と `文字は二重引用符の中で特別な意味を持ちます。 バックスラッシュは、後ろに$、`、"、\、または{newline}文字のいずれかが続く場合にのみ特別な意味を保持します。二重引用符の中にバックスラッシュを追加して二重引用符を引用符で囲むことができます。二重引用符の中に!を表示するには、バックスラッシュを使用してください。
答え2
バラより引用の Bash リファレンスマニュアルセクション。
デフォルトでは、文字を一重引用符または二重引用符で囲むと、特別な意味のないリテラル文字に変換されます(二重引用符の例外はいくつかありますが、ここでは重要ではありません)。したがって、一連の文字内では、'"hey"'
一重引用符は他のすべての文字を「保護」し、二重引用符は特別な意味を失い、リテラル文字のままです。