変数値を引用符で囲むことと、 bash で変数値を引用しないこと

変数値を引用符で囲むことと、 bash で変数値を引用しないこと

私がこのようなことをするとき:

x="hi echo hello"

または

x='hi echo hello'

これはx文字列を含みますhi echo hello

ただし、引用符を使用しない場合は次のようになります。

x=hi echo hello

これによりx文字列が含まれ、hiコマンドがecho hello実行されます。


しかし、変数の値が単一の単語で構成されている場合、次の間に違いはありますか?

x="hi"
x='hi'
x=hi

答え1

世界に代替がある場合にのみ可能です。

だから

x=$FRED

以下とは異なります。

x='$FRED'

答え2

いいえ。一般的な文字と数字の意味は、引用の有無にかかわらず変わりません。

さらに、で述べたようにこの回答、拡張ワード分割または割り当てを実行するとファイル名のワイルドカードが発生しないため、ワイルドカードはそのコンテキストでは特別ではなく、他のほとんどとは異なり、分割を呼び出さずに引用符で囲まれていない変数を使用できます。 var1=*リテラルアスタリスクを割り当て、IFS文字に関係なくvar2=$var1値を割り当てます。var1

他の特殊文字は非常に特別です。

  • スペース
  • $拡張のためのバックティック`(@ Julianが指摘したように)
  • 配列を割り当てるための括弧(@cas参照)が正しく配置されないと、構文エラーが発生します。
  • !履歴拡張、<>|リダイレクト、パイプ;終了、&および\その他の文字エスケープに使用されるバックスラッシュ。

特別な意味を持たないようにするには、これらすべての項目を引用またはエスケープする必要があります。

答え3

シェルが最初にすることは線を分けることです。引用しない空白(メタ文字)をトークンに変換します。これはIFS値が次のようになるため、拡張後に完成した単語分割とは異なります。いいえ使用される。初期トークンの分割に使用される文字はメタ文字で固定されます。これらすべてには以下がvar含まれますHello(時々簡単に):

var=Hello echo World       # Space
var=Hello;echo World       # Semicolon
var=Hello   echo World     # Tab
var=Hello&echo World       # Ampersand

また、この初期トークン分割の場合、割り当ての右側が参照として処理されます。
以下はすべて同じです。

var="Hello World"
var='Hello World'
var=Hello\ World

キャラクターのみ参考にしてください〜しなければならない引用された内容は空です。 IFSが変更された場合も同様です。

もちろん、二重引用符の中にはさまざまな拡張が許可されています。

var=~"/"       ;  var=~/         tilde  expansion (outside quotes)
var="$PWD"     ;  var=$PWD       parameter  and variable expansion
var="$(pwd)"   ;  var=$(pwd)     command substitution
var="$((2+3))" ;  var=$((2+3))   arithmetic expansion
var="!$"       ;  var=!$         history substitution

上記のすべてのペアは同じです。

まったくこれらのペアは、単一引用符(または一部の逆引用符)内で同じように機能します。たとえば、次のようになります。

var='$PWD'     ;  var=\$PWD

しかもこれが全部だ。いいえ同じ:

var="( Hello World )"   ; var=( Hello World )

括弧は配列の割り当てをトリガします。


したがって、以下はすべて同じです。

var=hi
var="hi"
var='hi'
var=\hi
var=h\i
var=\h\i

以前に与えられた特別な条件を考慮します。

関連情報