2011-07-14 40 views

答えて

312

一重引用符では何も挿入されませんが、二重引用符(たとえば、変数、バッククォート、特定の\エスケープなど)が挿入されます。単一引用符で

3.1.2.2 Single Quotes

囲み文字(')引用符内の各文字のリテラル値を保持します:

[email protected]:~# echo "$(echo "upg")" 
upg 
[email protected]:~# echo '$(echo "upg")' 
$(echo "upg") 

バッシュマニュアルは、これは言っています。たとえバックスラッシュが前に置かれていても、一重引用符間に一重引用符はできません。

二重引用符で文字を囲むと

3.1.2.3 Double Quotes

"$`\を除いて、全ての文字のリテラル値を保持し、かつ、履歴展開が有効になっている場合、!$`の文字は、特別な意味を二重引用符で囲んでいます(Shell Expansions参照)。バックスラッシュには、$,`,",\または改行のいずれかの文字が続く場合にのみ、その特殊な意味が保持されます。二重引用符の中で、これらの文字の1つが後に続くバックスラッシュは削除されます。特別な意味を持たない文字に先行するバックスラッシュは変更されません。二重引用符は、二重引用符の前にバックスラッシュを付けて引用することができます。有効にすると、二重引用符で囲まれた!がバックスラッシュを使用してエスケープされない限り、履歴拡張が実行されます。 !より前のバックスラッシュは削除されません。

特別なパラメータ*および@は、二重引用符(Shell Parameter Expansionを参照)の場合に特別な意味を持ちます。二重引用符は、それらと出力の間に変数の値を、変数を評価する一方

167

あなたが何かをエコーときに何が起こるかを参照している場合は、単一引用符は、あなたがそれらの間で持っているものエコー文字通ります。例えば

、この

#!/bin/sh 
MYVAR=sometext 
echo "double quotes gives you $MYVAR" 
echo 'single quotes gives you $MYVAR' 

はこれを与える:

double quotes gives you sometext 
single quotes gives you $MYVAR 
87

accepted answerは素晴らしいです。私は、トピックの迅速な理解に役立つテーブルを作っています。説明には、単純な変数aとインデックス付き配列arrが含まれています。

我々は2列目の式

a=apple  # a simple variable 
arr=(apple) # an array with a single element 

、その後echoを設定した場合、我々は、3列目に示す結果/動作になるだろう。 4列目はその動作を説明しています。

# | Expression | Result  | Comments 
---+-------------+-------------+-------------------------------------------------------------------- 
1 | "$a"  | apple  | variables are expanded inside "" 
2 | '$a'  | $a   | variables are not expanded inside '' 
3 | "'$a'"  | 'apple'  | '' has no special meaning inside "" 
4 | '"$a"'  | "$a"  | "" is treated literally inside '' 
5 | '\''  | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting) 
6 | "red$arocks"| red   | $arocks does not expand $a; use ${a}rocks to preserve $a 
7 | "redapple$" | redapple$ | $ followed by no variable name evaluates to $ 
8 | '\"'  | \"   | \ has no special meaning inside '' 
9 | "\'"  | '   | \' is interpreted inside "" 
10 | "\""  | "   | \" is interpreted inside "" 
11 | "*"   | *   | glob does not work inside "" or '' 
12 | "\t\n"  | \t\n  | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting 
13 | "`echo hi`" | hi   | `` and $() are evaluated inside "" 
14 | '`echo hi`' | `echo hi` | `` and $() are not evaluated inside '' 
15 | '${arr[0]}' | ${arr[0]} | array access not possible inside '' 
16 | "${arr[0]}" | apple  | array access works inside "" 
17 | $'$a\''  | $a'   | single quotes can be escaped inside ANSI-C quoting 
18 | '!cmd'  | !cmd  | history expansion character '!' is ignored inside single quotes 
19 | "!cmd"  | cmd args | expands to the most recent command matching "cmd" 
---+-------------+-------------+-------------------------------------------------------------------- 

を参照:表は[StackOverflowの](https://stackoverflow.com)上の多くの質問への答えである

+2

。 – C0deDaedalus

+1

受け入れられた答えは、最後に '二重引用符で囲まれたときに特殊なパラメータ*と@は特別な意味を持っています。' '*"の結果はどのように '*'になりますか? –

関連する問題