`echo`と`for`を使ったPOSIXフィールドの分割と二重引用符の動作

`echo`と`for`を使ったPOSIXフィールドの分割と二重引用符の動作

POSIX規格によるとフィールド分割二重引用符、しかもforループecho "$s"次の例では、二重引用符を使用すると数字の間に新しい行が表示されますが、二重引用符を使用すると数字の間に新しい行が表示されないfor x in "$s"理由がわかりません。誰かがこれを明確にすることができますか?

$ s=$(seq 1 4)
$ echo $s
1 2 3 4
$ echo "$s"
1
2
3
4
$ for x in $s; do echo $x; done
1
2
3
4
$ for x in "$s"; do echo $x; done
1 2 3 4

答え1

正しく述べたように、IFS(フィールド分割)環境変数はここで重要な役割を果たします。通常、設定にはIFS<space>および<tab>文字<newline>が含まれます。つまり、変数に引用符が使用されていない場合、シェルインタプリタはIFS変数を値ごとに別々の引数に分割します(複数のIFS文字を圧縮しても)。

したがって、変数にはs次の値が常に存在します。残りは解釈に依存します。

1<newline>2<newline>3<newline>4

まず、forシェルが実行される前にループを4回$s分割して実行します。for次の場合、echo分割する項目がないため、各要素は1行に印刷されます(これが完了しましたecho)。

前述のように、2 番目は、for値全体に対して一度だけ実行されます。s今起こっているのは、シェルが変数を渡す前に変数を分離することですs(二重引用符がないため)。つまり、文字は関連性がなくなり、各数字はパラメータにすぎません。複数のパラメータをインポートするときは、空白文字で区切って同じ順序で印刷します。IFSechox<newline>echo

関連情報