スクリプトに$“ dollarsign-prefixed string”があるとはどういう意味ですか?


81

私はこれを初期化スクリプトで見ました:

echo $"Stopping Apache"

そのドル記号は何のためですか?

これまでの私の研究:

私はこれをbashマニュアルで見つけました:

引用

場合は設定、$'string'および$"string"引用は内で行われ${parameter}、二重引用符で囲まれた展開。このオプションはデフォルトで有効になっています。

...しかし、$接頭辞のある文字列とない文字列の違いは見つかりません:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD

回答:


111

ここでは2つの異なることが行われています。どちらもマニュアルに記載されていbashます

$ '

ドル記号の一重引用符は、特別な形式の引用符です。

ANSI Cの引用

$ 'string'という形式の単語は特別に扱われます。単語は文字列に展開され、ANSI C標準で指定されているように、バックスラッシュでエスケープされた文字が置き換えられます。

$ "

ドル記号の二重引用符はローカライズ用です:

ロケール翻訳

二重引用符で囲まれた文字列の前にドル記号(「$」)を付けると、現在のロケールに従って文字列が翻訳されます。現在のロケールがCまたはPOSIXの場合、ドル記号は無視されます。文字列が翻訳および置換される場合、置換は二重引用符で囲まれます。


22

文字列がの内部で展開されると$''、エスケープシーケンスが解釈されます。マンページから:

Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

簡単な例は、改行の\ nエスケープシーケンスです。

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

注:他のシェルでechoは、オプションを指定せずにエスケープシーケンスを解釈するため、異なる結果が得られる場合があります。


8
$"..."質問によると、の言及はありません。
Peter.O

-4

あなたはマニュアルを誤解しています。$引用符で囲まれた文字列が${parameter}展開内にある場合にのみ、効果が表示されます。

$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd

ソースと詳細:https : //lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html


6
これは質問に答えません$"…"。何か違うのです。
ジル

4
申し訳ありませんが、答えは間違っています${}。ANSI引用符を使用するために展開を使用する必要はありません。自分で確認してください:echo $'ab\ncd'
rozcietrzewiacz

1
この答えはextquote、質問が尋ねていたものではなく、間違って説明しようとしていたと思います。
jw013

1
"${...}"とは異なる$"..."
-GypsyCosmonaut
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.