bashの一重引用符$'string'と二重引用符$'string'の違いは何ですか?

bashの一重引用符$'string'と二重引用符$'string'の違いは何ですか?

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
    

私の質問は、$' ''sで囲まれた文字列と'sで囲まれた文字列の違いは何ですか?$" "bashecho

答え1

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

"string"これは、'string'より一般的な(弱い参照)および(強い参照)とは異なります。

答え2

$文字列の先頭:

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

エスケープシーケンスが解釈されるようにします。

バッシュリファレンスマニュアル[説明する]

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

しかし、

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

全く違います。これ[記事]ロケール固有の翻訳については、次のように言います。

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


メモ:IIRCは両方とも異なるシェル間でサポートを見つけること$'string'ができません$"string"。他のシェルの人々はこれを好奇心で見るだけでなく、スクリプトの移植性のためにこれを避けることができるかについて議論しました。

関連情報