この投稿には実際には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}を比較し、引用するかしないか
- 二重引用符はいつ必要ですか?