この投稿には実際には2つの別々の質問が含まれていますが、それらをグループ化すると、もう少しコンテキストが得られると思います。変数の引用符についてこの質問をしましたが、変数の展開が何であるかよくわかりません。 そもそも意味します。だから私の最初の質問は:
- 変数展開とは UNIX / Linuxで話しますか?
私の質問の2番目の部分は、次の用語に関連しています:
- グロブ
- 分割
上記はどういう意味で、変数の拡張にどのように影響しますか?元の質問に対する答えは次のように述べています:
(リストのコンテキストで)引用符がないことを、split + glob
演算子と考えてください。echo $testがechoglob(split( "$ test"))であるかのように。
グロビングの概念に直接対応する答えは見つかりませんでした。 および分割 むしろ、この最近の質問のような他の質問に答える際に、これらの用語を直接使用します。
承認された回答:
可変拡張 (標準用語はパラメータ拡張 、および変数置換と呼ばれることもあります )基本的には、変数をその値で置き換えることを意味します。より正確には、$VARIABLE
を置き換えることを意味します コンストラクト(または${VARIABLE}
または${VARIABLE#TEXT}
または他の構成)変数の値から構築された他のテキストによる。この他のテキストは変数の展開です。
拡張プロセスは次のようになります。 (私は一般的なケースについてのみ説明します。一部のシェル設定と拡張機能は動作を変更します。)
- 文字列である変数の値を取得します。変数が定義されていない場合は、空の文字列を使用してください。
- 構成に変換が含まれている場合は、それを適用します。たとえば、構成が
${VARIABLE#TEXT}
の場合 、および変数の値はTEXT
で始まります 、TEXT
を削除します 値の最初から。 - コンテキストで単一の単語が必要な場合(たとえば、二重引用符内、割り当ての右側、またはヒアドキュメント内)、ここで停止します。それ以外の場合は、次の手順に進みます。
- 分割 空白の各シーケンスで値を個別の単語に変換します。 (変数
IFS
空白以外の文字で分割するように変更できます。)したがって、結果は文字列ではなく、文字列のリストになります。値に空白のみが含まれている場合、このリストは空になる可能性があります。 - リストの各要素をファイル名のワイルドカードパターン、つまりグロブとして扱います。 。パターンが一部のファイルと一致する場合は、一致するファイル名のリストに置き換えられます。一致しない場合は、そのままになります。
たとえば、変数foo
a* b* c*
が含まれています 現在のディレクトリにはファイルbar
が含まれています 、baz
およびpaz
。次に、${foo#??}
次のように展開されます:
- 変数の値は8文字の文字列
a* b* c*
です。 。 -
#??
最初の2文字を削除して、6文字の文字列b* c*
を作成することを意味します (最初のスペース付き)。 - 展開がリストコンテキストにある場合(つまり、二重引用符または他の同様のコンテキストにない場合)、続行します。
- 文字列を空白で区切られた単語に分割すると、2つの文字列のリストが作成されます:
b*
およびc*
。 - 文字列
b*
、パターンとして解釈され、2つのファイルに一致します:bar
およびbaz
。文字列c*
一致するファイルがないため、そのままになります。結果は3つの文字列のリストです:bar
、baz
、c*
。
たとえば、echo ${foo#??}
bar baz c*
を出力します (コマンドecho
引数を間にスペースを入れて結合します。
詳細については、以下を参照してください:
- POSIX標準でのパラメーター拡張、それに続くフィールド分割とパス名拡張
- bashマニュアルのシェルパラメータの拡張、続いて単語の分割とファイル名の拡張
- $VARと${VAR}を比較し、引用するかしないか
- 二重引用符はいつ必要ですか?