bashで単一引用符で囲まれた$ 'string'と二重引用符で囲まれた$“ string”の違いは何ですか?


9

私はecho次の2つのコマンドを使用して新しい行を実行しようとしました:

  1. 最初のコマンド:

    echo $'Hello World\nThis is a new line'

    応答:

    Hello World
    This is a new line
    
  2. 2番目のコマンド:

    echo $"Hello World\nThis is a new line"

    応答:

    Hello World\nThis is a new line

私の質問はで包まれた文字列の違い何さ$' 'で包まれた文字列の対$" "bashさんはecho


役立つメモ:二重引用符は弱い引用とも呼ばれ、単一引用符は強い引用とも呼ばれます。
Rafaf Tahsin

2
はい、しかし、"weak quote"'strong quote'は異なっている$'C String'$"I18N String"
DopeGhoti

あなたは本当のMVPです。:D >>> @DopeGhoti
Rafaf Tahsin

私はできることをします(:
DopeGhoti

回答:


10

ここで説明するように、構文は、改行$'string'などのマジックエスケープ文字を含むCスタイルの文字列を指定\nします。 $"string"I18N拡張用で、そのような魔法のエスケープはありません。

これらは、より一般的な"string"(弱い引用)および'string'(強い引用)とは異なることに注意してください。


9

$文字列の先頭の:

echo $'Hello World\nThis is a new line'

エスケープシーケンスを解釈させます。

バッシュリファレンスマニュアル[言う]

$ 'string'形式の単語は特別に扱われます。単語は文字列に展開され、バックスラッシュでエスケープされた文字はANSI C規格の指定に従って置き換えられます。..
..
展開された結果は、ドル記号が存在しないかのように、単一引用符で囲まれます。

だが

echo $"Hello World\nThis is a new line"

完全に異なります。ロケール固有の翻訳に関するこの[記事]は言う:

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


注: IIRCは両方$'string'$"string"も異なるシェル間でサポートされない場合があります。他のシェルの人々は好奇心を持ってそれらを見るだけでなく、スクリプトの移植性のためにこれを回避できるかどうかについても議論します。


1
ksh93また理解してい$'...'ます。
クサラナンダ

@Kusalananda:うーん、
いいメモ

4
$'xxx'バシズムではないが、ksh数年前に最初に導入されbashた。現在、POSIX標準でもサポートされてzshおりbusybox sh、POSIX標準でレビュー中です。
jlliagre

@jlliagre:時間を感謝します:)。私は
正直
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.