$(echo ...)を使用しない限り、forループでIFSシェル変数を設定して文字列を単語に分割するのはどうですか?

$(echo ...)を使用しない限り、forループでIFSシェル変数を設定して文字列を単語に分割するのはどうですか?

設定により、文字列が、およびの3つの単語に分割されると仮定IFS='X'します。bashfooXbarXbazfoobarbaz

forただし、コマンド置換によって文字列がループに提供されている場合にのみ機能します$(echo fooXbarXbaz)

$ IFS='X'; for x in fooXbarXbaz; do echo Y${x}Z; done
Yfoo bar bazZ
$ IFS='X'; for x in $(echo fooXbarXbaz); do echo Y${x}Z; done
YfooZ
YbarZ
YbazZ

最初の例のコマンドは3つのfooXbarXbaz単語に分割されませんが、2番目の例では成功する理由を誰かが説明できますか?

ベストアンサー1

$IFS引用符のない拡張噴射にのみ使用されます。には拡張子がありませんfor x in fooXbarXbaz。ただし、引用符のない拡張があります。これは、および3つの引数で呼び出されるというecho Y${x}Z意味です。ユーティリティは、各引数の間にスペースを入れて印刷するので。echoYfoobarbazZechoYfoo bar bazZ

2番目の例では、文字列は拡張であるコマンド置換の出力であるため、文字列はループ用に分割されています。

この変数はユーティリティへの入力をIFS分割するためにも使用されます。read

おすすめ記事