GNU/Linux >> Linux の 問題 >  >> Linux

シェル変数の拡張とグロブとスプリットの影響?

この投稿には実際には2つの別々の質問が含まれていますが、それらをグループ化すると、もう少しコンテキストが得られると思います。変数の引用符についてこの質問をしましたが、変数の展開が何であるかよくわかりません。 そもそも意味します。だから私の最初の質問は:

  1. 変数展開とは UNIX / Linuxで話しますか?

私の質問の2番目の部分は、次の用語に関連しています:

  1. グロブ
  2. 分割

上記はどういう意味で、変数の拡張にどのように影響しますか?元の質問に対する答えは次のように述べています:

(リストのコンテキストで)引用符がないことを、split + glob
演算子と考えてください。

echo $testがechoglob(split( "$ test"))であるかのように。

グロビングの概念に直接対応する答えは見つかりませんでした。 および分割 むしろ、この最近の質問のような他の質問に答える際に、これらの用語を直接使用します。

承認された回答:

可変拡張 (標準用語はパラメータ拡張 、および変数置換と呼ばれることもあります )基本的には、変数をその値で置き換えることを意味します。より正確には、$VARIABLEを置き換えることを意味します コンストラクト(または${VARIABLE} または${VARIABLE#TEXT} または他の構成)変数の値から構築された他のテキストによる。この他のテキストは変数の展開です。

拡張プロセスは次のようになります。 (私は一般的なケースについてのみ説明します。一部のシェル設定と拡張機能は動作を変更します。)

  1. 文字列である変数の値を取得します。変数が定義されていない場合は、空の文字列を使用してください。
  2. 構成に変換が含まれている場合は、それを適用します。たとえば、構成が${VARIABLE#TEXT}の場合 、および変数の値はTEXTで始まります 、TEXTを削除します 値の最初から。
  3. コンテキストで単一の単語が必要な場合(たとえば、二重引用符内、割り当ての右側、またはヒアドキュメント内)、ここで停止します。それ以外の場合は、次の手順に進みます。
  4. 分割 空白の各シーケンスで値を個別の単語に変換します。 (変数IFS 空白以外の文字で分割するように変更できます。)したがって、結果は文字列ではなく、文字列のリストになります。値に空白のみが含まれている場合、このリストは空になる可能性があります。
  5. リストの各要素をファイル名のワイルドカードパターン、つまりグロブとして扱います。 。パターンが一部のファイルと一致する場合は、一致するファイル名のリストに置き換えられます。一致しない場合は、そのままになります。

たとえば、変数foo a* b* c*が含まれています 現在のディレクトリにはファイルbarが含まれています 、baz およびpaz 。次に、${foo#??} 次のように展開されます:

  1. 変数の値は8文字の文字列a* b* c*です。 。
  2. #?? 最初の2文字を削除して、6文字の文字列 b* c*を作成することを意味します (最初のスペース付き)。
  3. 展開がリストコンテキストにある場合(つまり、二重引用符または他の同様のコンテキストにない場合)、続行します。
  4. 文字列を空白で区切られた単語に分割すると、2つの文字列のリストが作成されます:b* およびc*
  5. 文字列b* 、パターンとして解釈され、2つのファイルに一致します:bar およびbaz 。文字列c* 一致するファイルがないため、そのままになります。結果は3つの文字列のリストです:barbazc*

たとえば、echo ${foo#??} bar baz c*を出力します (コマンドecho 引数を間にスペースを入れて結合します。

関連:SSDに入れてはいけないことは何ですか?

詳細については、以下を参照してください:

  • POSIX標準でのパラメーター拡張、それに続くフィールド分割とパス名拡張
  • bashマニュアルのシェルパラメータの拡張、続いて単語の分割とファイル名の拡張
  • $VARと${VAR}を比較し、引用するかしないか
  • 二重引用符はいつ必要ですか?

Linux
  1. ログインシェルと非ログインシェルの違いは?

  2. コマンドの出力をシェル変数に保存しますか?

  3. 独自のIPアドレスを取得し、シェルスクリプトの変数に保存する方法は?

  1. 配管とコマンド拡張の違いは?

  2. 変数の拡張を延期する方法は?

  3. Bashの正規表現が変数であり、直接ではない場合にのみ機能するのはなぜですか?

  1. Linux シェル スクリプトまたは変数の日付と時刻の書式設定

  2. 混合シェルと python スクリプトは可能ですか?

  3. 変数でディレクトリを変更するシェルスクリプト