"..."
場合によっては、特定のテキスト(、および'...'
)を参照するためにさまざまな方法を使用するシェルスクリプトを表示します。なぜそんなにさまざまな種類の参考文献が使われていますか?$'...'
$"..."
彼らは違う振る舞いをしますか、それとも私がその中でできることに影響しますか?
答え1
これらはすべて異なることを意味し、その中に異なるものを書くことができます(または同じことを異なる意味で)。さまざまなタイプの参照は、その中のさまざまなエスケープシーケンスを解釈したり()変数補間()やその中にある他のタイプの拡張を\something
許可または許可したりしません。$something
簡単に言うと:
'...'
文字通り。"..."
変数と挿入された引用符文字が許可されます。$'...'
文字エスケープを実行し\n
ますが、変数を拡張しません。$"..."
Bashとkshの人間の言語翻訳に使用されます。
「アポストロフィ」
一重引用符の間に書き込まれた内容は文字通り処理され、まったく処理されません。バックスラッシュとドル記号は特に意味がありません。これは、バックスラッシュエスケープ文字(別の一重引用符を含む)、変数の挿入、または他のシェル機能が利用できないことを意味します。
これらの例のすべては、引用符の間に書かれた内容を文字通り意味します。
パスワード | 結果 |
---|---|
'hello world' |
こんにちは世界 |
'/pkg/bin:$PATH' |
/pkg/bin:$PATH |
'hello\nworld' |
こんにちは。\ n |
'`echo abc`' |
「エコABC」 |
'I\'dn\'t've' |
私はいません。 |
最後の項目はより複雑です。二つ一重引用符で囲まれた文字列は、引用符のない一部のテキストで実行されます。最初にはが含まれていますI\
。引用符で囲まれていないテキストdn\'t
には、エスケープされた一重引用符が含まれています。シェル層からしたがって、引用符で囲まれた文字列で始まるのではなく、リテラル文字として含まれます(したがってdn't
)。最後に引用された文字列は、シェルが通常動作ve
するように.allを1つの単語にまとめたものです。
リテラルテキストと変数を組み合わせる一般的な慣用語は、次のように一緒に実行することです。
'let x="'$PATH\"
結果は次のとおりです。
let x="/usr/bin:/bin"
単語として($PATH
場合によっては二重引用符を使用することをお勧めします。 -変数の空白またはワイルドカード値他の方法で処理することができます- しかし、読みやすい実行例ではそうではありません)。
「二重引用符」
二重引用符内では、両方の拡張が処理され、バックスラッシュエスケープ文字を使用して拡張またはエスケープ処理を防ぐことができます。
二重引用符の中には2種類の拡張があります。
$
(パラメータの拡張$abc
と${abc}
、コマンドの置き換え$(...)
と算術拡張$((...))
);- バックティックを使用したコマンドの置き換え
`abc`
。
引用符内で、バックスラッシュは、または$
前に配置することでこれらの拡張を抑制できます`
。閉じる二重引用符をエスケープして、文字列または他のバックスラッシュにのみ\"
含めるようにすることもできます。"
外部引用符\
の後に改行文字が続くように、次のように処理されます。行連続(効果的に削除されました)他のバックスラッシュは文字通り残ります。追加の文字を生成するためにエスケープできず、削除されません。
これらの例のいくつかは以前とは異なる動作をしますが、一部はそうではありません。
パスワード | 結果 |
---|---|
"hello world" |
こんにちは世界 |
"/pkg/bin:$PATH" |
/pkg/bin:/bin:/usr/bin |
"hello\nworld" |
こんにちは。\ n |
"hello\\nworld" |
こんにちは。\ n |
"`echo abc`" |
アルファベット |
"I\'dn\'t've" |
私はいません。 |
"I'dn't've" |
私はいません。 |
"I\"dn\"t've" |
私はいません。 |
$ 'ANSI-Cリファレンス'
この引用を使用すると、Cスタイルのバックスラッシュエスケープを処理できますが、いいえ変数または代替項目が含まれます。これはただ文字エスケープをサポートする参照タイプ。
これはkshの拡張で、Bash、zsh、その他のシェルでサポートされています。そうではないしかし、POSIX標準の一部なので、Max Portableスクリプトでは使用できませんが、Bashまたはkshスクリプトでは自由に使用できます。
これらのエスケープ文字はすべて、C、意味、、、、、、、、、、およびリテラル\a
エスケープ\b
文字と一緒に使用できます。また、Bashとkshで拡張(エスケープ文字)と拡張(入力する内容)もサポートしています。\f
\n
\r
\t
\v
\\
\'
\"
\?
\e
\cx
Ctrl-x経由、キャリッジリターンなど\cM
)。 Shellには独自の小さな拡張セットがあります。
また、4つの一般的な文字エスケープも可能です。
\nnn
、8進値を持つシングルバイトに\xHH
、16進値を持つシングルバイトヘヘ\uHHHH
、16進インデックスを持つUnicodeコードポイントはははは\UHHHHHHHH
、16進インデックスを持つUnicodeコードポイントハハハハハハハ
最初の数字の後のすべての数字はオプションです。
$
意味がなく、`
文字通り保持されるため、変数を含めることはできません。
パスワード | 結果 |
---|---|
$'hello world' |
こんにちは世界 |
$'/pkg/bin:$PATH' |
/pkg/bin:$PATH |
$'hello\nworld' |
こんにちは 世界 |
$'`echo abc`' |
「エコABC」 |
$'I\'dn\'t\'ve' |
私はいません。 |
$'\U1f574\u263A' |