引用符とエスケープ

Bash には、文字列というデータ型が 1 つだけあります。ユーザーがどのようなデータを入力しても、Bash はそれを文字列として扱います。したがって、文字列関連の引用符とエスケープは Bash にとって非常に重要です。

逃げる

一部の文字は Bash で特別な意味を持ちます (「$」、「&」、「*」など)。

$エコー$日付

$

上記の例では、「$」は特殊文字であるため、「$date」を出力しても結果は生成されません。

これらの特殊文字をそのまま出力したい場合は、文字の前にバックスラッシュを追加して通常の文字に変換する必要があります。これを「逃亡」といいます。

$ エコー \$date
$date

上記コマンドにおいて、特殊文字「$」の前にバックスラッシュを付けた場合のみ、そのまま出力できます。

バックスラッシュ自体も特殊文字です。バックスラッシュをそのまま出力したい場合は、バックスラッシュ自体をエスケープし、バックスラッシュ(\\)を2つ続けて使用する必要があります。

$ エコー \\
\

上記の例では、バックスラッシュ自体を出力します。

エスケープに加えて、バックスラッシュは一部の印刷不可能な文字を表すこともできます。

  • \a: ベルを鳴らします
  • \b: バックスペース
  • \n: 改行
  • \r: キャリッジリターン
  • \t: タブ文字

これらの印刷不可能な文字をコマンドラインで使用したい場合は、文字を引用符で囲み、echo コマンドの -e パラメータを使用します。

$ エコー\tb
atb

$ echo -e "a\tb"
a b

上記の例では、コマンド ラインは印刷不可能な文字 \t を直接出力しますが、Bash はこれを正しく解釈できません。それらを引用符で囲み、「echo」コマンドの「-e」パラメータを使用する必要があります。

改行文字はコマンドの終わりを示す特殊文字です。Bash はこの文字を受け取ると、入力されたコマンドを解釈して実行します。改行文字の前にバックスラッシュ エスケープを追加すると、改行文字が通常の文字に変わり、Bash はそれを長さ 0 の NULL 文字として扱うため、1 行のコマンドを複数行に分割できます。

$mv\
/パス/へ/foo \
/パス/へ/バー

# に相当
$ mv /パス/to/foo /パス/to/bar

上記の例では、コマンドが長すぎる場合は、行末にバックスラッシュを使用して複数行に書き直すことができます。これは、複数行のコマンドを記述する一般的な方法です。

一重引用符

Bash では、文字列を一重引用符または二重引用符で囲むことができます。

一重引用符は、文字の文字通りの意味を保持するために使用されます。一重引用符内のさまざまな特殊文字は、アスタリスク (*)、ドル記号 ($)、バックスラッシュ (\) などの通常の文字に変更されます。

$ エコー '*'
*

$ エコー '$USER'
$ユーザー

$ エコー '$((2+2))'
$((2+2))

$ エコー '$(エコー foo)'
$(エコーフー)

上記のコマンドでは、一重引用符で Bash の展開、変数参照、算術演算、およびサブコマンドが無効になります。一重引用符が使用されていない場合、それらは Bash によって自動的に展開されます。

バックスラッシュは一重引用符内で通常の文字になるため、一重引用符内で一重引用符を使用する必要がある場合は、外側の一重引用符の前にドル記号 ($) を追加して、内側をエスケープする必要があります。一重引用符。

# 正しくない
$ エコー、それは

# 正しくない
$ echo 'それ'

# 正しい
$ echo $'it's'

ただし、より合理的なアプローチは、代わりに二重引用符内で一重引用符を使用することです。

$ エコー「それは」
その

二重引用符

二重引用符は一重引用符よりも緩やかです。二重引用符内のほとんどの特殊文字は特別な意味を失い、通常の文字になります。

$エコー「*」
*

上記の例では、ワイルドカード文字「*」は特殊文字であり、二重引用符で囲むと通常の文字となり、そのまま出力されます。これは、二重引用符内ではファイル名の展開が行われないことを意味するため、特別な注意が必要です。

ただし、ドル記号 ($)、バックティック ( )、バックスラッシュ (`) の 3 つの特殊文字は除外されます。これら 3 つの文字は二重引用符内で特別な意味を持ち、Bash によって自動的に展開されます。

$ エコー "$SHELL"
/bin/bash

$ echo "`日付`"
2020年1月27日月曜日 13:33:18 CST

上の例では、ドル記号 ($) とバッククォート記号 ( `) は二重引用符内で特別な意味を保持しています。ドル記号は変数を引用するために使用され、バックティックはサブコマンドを実行するために使用されます。

$ echo "「こんにちは。」と言います。"
私なら「こんにちは」と言うでしょう。

$ エコー "\\"
\

上記の例では、バックスラッシュは二重引用符内で特別な意味を保持しており、エスケープに使用されています。したがって、バックスラッシュを使用したり、二重引用符の中に二重引用符を挿入したり、バックスラッシュ自体を挿入したりできます。

二重引用符で囲まれた場合、改行文字は特別な意味を失い、Bash はそれをコマンドの終わりとして解釈せず、通常の改行文字として解釈します。したがって、二重引用符を使用してコマンド ラインに複数行のテキストを入力できます。

$ echo "こんにちは
世界"
こんにちは
世界

上記のコマンドでは、Bash は通常、改行文字をコマンドの終わりとして解釈しますが、改行文字は二重引用符で囲まれたこの特別な機能を失い、改行にのみ使用されるため、複数行を入力できます。 echoコマンドは改行文字をそのまま出力し、表示時に改行文字として解釈します。

二重引用符のもう 1 つの一般的な使用法は、ファイル名にスペースが含まれる場合です。このとき、ファイル名を二重引用符 (または一重引用符) で囲む必要があります。

$ ls "2 つの単語.txt"

上記のコマンドにおいて、「two Words.txt」はスペースを含むファイル名であり、二重引用符で囲まれていない場合、Bash では 2 つのファイルとして扱われます。

二重引用符は余分な空白を変更せずに保持します。

$ echo "これはテストです"
これはテストです

二重引用符には、元のコマンドの出力形式を保存する機能もあります。

# 単一行出力
$ エコー $(cal)
2020年1月月曜日 2 3 4 5 6 1 2 3 ... 31

#オリジナルフォーマット出力
$ エコー "$(cal)"
      2020年1月
1日目 2 3 4 5 6
          1 2 3 4
 5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

上の例では、$(cal) が二重引用符で囲まれていない場合、echo はすべての結果を 1 行に出力し、元の書式設定をすべて破棄します。

ここのドキュメント

ヒアドキュメント(ヒアドキュメント)とは、以下の形式で複数行の文字列を入力する方法です。

<< トークン
文章
トークン

その形式は開始タグ (<< token) と終了タグ (token) に分かれています。開始タグは、2 つの不等号 + ヒア ドキュメントの名前です。名前は任意に選択でき、その後に改行文字が続く必要があります。終了タグは、別の行の上部のスペースに記述されます。先頭のスペースではない場合、終了タグは効果がありません。この 2 つの間には、複数行の文字列の内容が含まれます。

以下は、ヒアドキュメントを通じて HTML コードを出力する例です。

$ 猫 << _EOF_
<html>
<頭>
    <タイトル>
    ページのタイトル
    </タイトル>
</head>

<本文>
    ページのコンテンツがここに表示されます。
</body>
</html>
_EOF_

変数の置換はヒアドキュメント内で行われ、バックスラッシュのエスケープはサポートされますが、二重引用符と一重引用符も文法的な効果を失い、通常の文字になります。

$ foo='ハローワールド'
$ cat << _example_
$foo
「$ふー」
「$foo」
_例_

こんにちは世界
"こんにちは世界"
'こんにちは世界'

上記の例では、変数 $foo が置き換えられていますが、二重引用符と一重引用符はそのまま出力されており、参照関数が失われていることがわかります。

変数置換が発生しないようにするには、ヒアドキュメントの開始タグを一重引用符で囲みます。

$ foo='ハローワールド'
$ cat << '_example_'
$foo
「$ふー」
「$foo」
_例_

$foo
「$ふー」
「$foo

上の例では、ヒアドキュメントの開始タグ (_example_) が一重引用符で囲まれているため、変数置換が失敗します。

Here ドキュメントの本質は、文字列出力を特定のコマンドにリダイレクトするリダイレクトです。これは、「echo」コマンドを含めることと同じです。

$ コマンド << トークン
  弦
トークン

# に相当

$エコー文字列コマンド

上記のコードでは、ヒアドキュメントは echo コマンドのリダイレクトに相当します。

したがって、Here 文字列は標準入力をパラメータとして受け入れることができるコマンドにのみ適しており、他のコマンドには無効です。たとえば、echo コマンドはパラメータとして Here ドキュメントを使用できません。

$ echo << _example_
こんにちは
_例_

ヒアドキュメントは echo コマンドに対して有効ではないため、上の例では出力は生成されません。

また、ヒアドキュメントは変数の値としては使用できず、コマンドのパラメータとしてのみ使用できます。

ここの文字列

Here ドキュメントには Here 文字列と呼ばれる変形もあり、これは 3 つの不等号 (<<<) で表されます。

<<< 文字列

その機能は、標準入力を通じてコマンドに文字列を渡すことです。

一部のコマンドは指定されたパラメーターを直接受け入れ、結果は標準入力を介してパラメーターを受け入れる場合とは異なります。このため、この構文を使用すると、標準入力を介してコマンドに文字列を渡すことがより便利になります。たとえば、「cat」コマンドは標準入力から渡される文字列のみを受け入れます。

$ cat <<< 'こんにちは'
# に相当
$ エコー 'こんにちは' |

上記の最初の構文では Here 文字列が使用されており、2 番目の構文よりもセマンティクスが優れており、より簡潔になっているようです。

$ md5sum <<< 'ddd'
# に相当
$ エコー 'dd5' |

上記の例では、md5sum コマンドはパラメータとして標準入力のみを受け入れることができます。コマンドの後に文字列を直接置くことはできません。つまり、md5sum dddddd と見なされます。ファイル名として解釈されます。このとき、Here 文字列を使用して、その文字列を md5sum コマンドに渡すことができます。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0