私はbashチュートリアルでこの例を見つけました:
words="foo bar doo"; for x in $words; do ...
私の理解は、この場合、words
「文字列とスペース」を使用して定義された一般変数であることです。著者はこれについて説明しません(これはbash初心者チュートリアルです)。
私の質問は、これを行うbash(または他のシェル)の機能が何であるかです。
for x in $words
x
- 各反復に値を割り当てるという意味です。foo
bashのマニュアルに文書化されているこの機能はどこで見つけることができますか?一部のリンク(文書、ブログ)を教えていただきありがとうございます。bar
doo
Bash用語でこの構造を呼び出す方法
words="foo bar doo"
(Pythonのように)リストですか?
ここで同様の記事を見つけました。配列宣言:二重引用符と角括弧。
ありがとうございます。
答え1
bash
マニュアルで次の内容を確認できます。
噴射
シェルスキャンパラメータ拡張結果、命令置換、算術拡張単語を分割すると二重引用符で囲まれません。。シェルは各文字を
IFS
区切り文字として扱い、別の拡張結果をその文字の単語に分割します。設定されていIFS
ないか、値が次の場合<space><tab><newline>
デフォルト値は、<space>
前の拡張結果の始まりと終わりにある、およびシーケンスを無視します。<newline>
IFS
始まりや終わりではない一連の文字は、単語を区切るために使用されます。。IFS
デフォルト以外の値を使用すると、空白文字が値IFS
(スペース文字)内にある限り、単語の先頭と末尾のスペースとタブのシーケンスは無視されます。空白以外の文字と隣接する空白文字は別々のフィールドです。空白文字シーケンスも区切り文字と見なされます。値が空の場合、単語分割は発生しません。IFS
IFS
IFS
IFS
IFS
IFS
割り当てると、words
スペースを含む文字列が生成されます。問題はそれをどのように使用するかである。
あなたに関する限り、
words="foo bar doo"; for x in $words; do ...
以下と同じ:
for x in foo bar doo; do ...
したがって、シェルはfoo
、およびを3つの単語にbar
分割しdoo
(空白で区切られているため)、ループはfor
各単語に対して3回実行され、$x
毎回関連する単語を割り当てます(のようにpython
)。例:
$ words="foo bar doo"; for x in $words; do echo $x; done
foo
bar
doo
$words
ループ内でを引用すると、スペースをfor
含む単一の単語として扱われ、分割されません。だから:
words="foo bar doo"; for x in "$words"; do ...
以下と同じ:
for x in "foo bar doo"; do ...
この場合、ループは一度だけ実行され、その中の値は文字列に$x
なります"foo bar doo"
。
$ words="foo bar doo"; for x in "$words"; do echo $x; done
foo bar doo