私がこのようなことをするとき:
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
以前に与えられた特別な条件を考慮します。