サーチ…


構文

  • \ C(改行を除く任意の1文字)
  • '一重引用符を除くすべてのリテラル'; 'this:' \ ''は一重引用符です '
  • $ 'のみ\\と\'は特殊です。 \ n =改行など。
  • "$変数と他のテキスト; \" \\\ $ \ "は特別な"

改行と制御文字

改行は、単一文字列または二重引用符で囲まれた文字列に含めることができます。バックスラッシュ改行で改行が行われないことに注意してください。改行は無視されます。

newline1='
'
newline2="
"
newline3=$'\n'
empty=\

echo "Line${newline1}break"
echo "Line${newline2}break"
echo "Line${newline3}break"
echo "No line break${empty} here"

ドル記号文字列の中では、他の多くのプログラミング言語のように、制御文字を挿入するために、バックスラッシュ文字またはバックスラッシュ8進数を使用することができます。

echo $'Tab: [\t]'
echo $'Tab again: [\009]'
echo $'Form feed: [\f]'
echo $'Line\nbreak'

変数とコマンド置換の二重引用符

変数の置換は、二重引用符でのみ使用してください。

calculation='2 * 3'
echo "$calculation"         # prints 2 * 3
echo $calculation           # prints 2, the list of files in the current directory, and 3
echo "$(($calculation))"    # prints 6

二重引用符の外では、 $varの値とるvar 、空白で区切られた部分に分割し、そしてグロブ(ワイルドカード)のパターンとして、各パーツを解釈します。この振る舞いが必要でない限り、常に$varを二重引用符"$var"ます。

"$(mycommand)"mycommandの出力、 $(mycommand)はsplit + globの出力結果です。

echo "$var"             # good
echo "$(mycommand)"     # good 
another=$var            # also works, assignment is implicitly double-quoted
make -D THING=$var      # BAD! This is not a bash assignment.
make -D THING="$var"    # good
make -D "THING=$var"    # also good

コマンド置換は、独自の引用コンテキストを取得します。パーザは最初の"文字を貪欲に検索するのではなく、入れ子の深さを追跡するので、任意のネストされた置換を書き込むのは簡単ですが、StackOverflow構文ハイライターはこれを解析します。

echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”

コマンド置換の変数引数は、展開内でも二重引用符で囲む必要があります。

echo "$(mycommand "$arg1" "$arg2")"

リテラルテキストを引用する

この段落のすべての例では、

!"#$&'()*;<=>?  @[\]^`{|}~

バックスラッシュは次の文字を引用します。つまり、次の文字は文字通り解釈されます。 1つの例外は改行です。バックスラッシュ改行は空の文字列に展開されます。

echo \!\"\#\$\&\'\(\)\*\;\<\=\>\?\ \ \@\[\\\]\^\`\{\|\}\~

単一引用符(前方引用符の間のすべてのテキスト'もアポストロフィとして知られているが、)文字通り印刷されます。バックスラッシュでさえそれ自体を表しており、一重引用符を含めることは不可能です。代わりに、リテラル文字列を停止し、リテラルの一重引用符をバックスラッシュでインクルードし、リテラル文字列を再び開始することができます。したがって、4文字シーケンス'\''は、リテラル文字列に単一引用符を含めることを事実上許可します。

echo '!"#$&'\''()*;<=>?  @[\]^`{|}~'
#          ^^^^

Dollar-single-quoteは、他の多くのプログラミング言語と同様に文字列リテラル$'…'開始します。バックスラッシュは次の文字を引用します。

echo $'!"#$&\'()*;<=>?  @[\\]^`{|}~'
#           ^^            ^^

"二重引用符"は半角リテラル文字列を区切り、文字" \ $`のみがその特別な意味を保持します。これらの文字にはバックスラッシュが必要です(バックスラッシュの後に他の文字が続く場合は、バックスラッシュが残ります)。二重引用符は、変数やコマンド置換を含むときに最も有用です。

echo "!\"#\$&'()*;<=>?  @[\\]^\`{|}~"
#      ^^                 ^^  ^^
echo "!\"#\$&'()*;<=>?  @[\]^\`{|}~"
#      ^^                 ^  ^^      \[ prints \[

対話的に、それに注意してください!二重引用符で囲まれた履歴展開を引き起こします: "!oops"oopsを含む古いコマンドを探します。 "\!oops"は履歴拡張を行わず、バックスラッシュを保持します。これはスクリプトでは発生しません。

二重引用符と一重引用符の違い

二重引用符一重引用符
変数の拡張を許可する可変展開を防止する
有効になっている場合、履歴拡張を許可します歴史の拡大を防ぐ
コマンド置換を許可するコマンド置換を防止する
*@は特別な意味を持つことができます *@は常にリテラルです
一重引用符または二重引用符の両方を含むことができます一重引用符は一重引用符の内部では使用できません
$`"\は特別な意味を持たないように\でエスケープすることができますそれらはすべてリテラルです

両方に共通のプロパティ

  • グロビングを防ぐ
  • 単語分割を防止する

例:

$ echo "!cat"
echo "cat file"
cat file
$ echo '!cat'
!cat
echo "\"'\""
"'"
$ a='var'
$ echo '$a'
$a
$ echo "$a"
var


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow