forループの前にIFSを一時的に変更します。

forループの前にIFSを一時的に変更します。

SHELLコマンドの直前に変数の割り当てが許可されていることがわかっているので、IFS=":" read a b c d <<< "$here_string"大丈夫でしょう...

私が知りたいのは、ループなどの複合文を使用すると、このような割り当てが機能しないことです。同様のことを試しましたが、IFS=":" for i in $PATH; do echo $i; done構文エラーが発生しました。私はいつも同様のことができますが、ループなどの複合ステートメントoldIFS="$IFS"; IFS=":"; for....; IFS="$oldIFS"に対してこれらのインライン割り当て操作を実行する方法があるかどうか疑問に思います。for

ベストアンサー1

for予約語なので、次のようになります。特別なルール:

次の単語は予約語と見なされるべきです。

! { } ケース完了 elif else esac fi for if in then Until while

この認識は、文字が引用されず、単語が次のように使用される場合にのみ発生します。

  • コマンドの最初の単語

  • 次の予約語を除く予約語の後の最初の単語ケース~のためまたは存在する

  • Caseコマンドの3番目の単語(のみ存在するこの場合は有効です)

  • forコマンドの3番目の単語(のみ存在するそしてするこの場合は有効です)

試してみると

IFS=":" for i in $PATH; do echo $i; done

for上記の規則によれば、キーワードはコマンドの最初の単語ではないため、これはループではありません。しかし、あなたが望む結果を得ることができます

tr ':' '\n' <<< "$PATH"               #Bash, Ksh, Zsh
printf "%s\n" "$PATH" | tr ':' '\n'   #Any standard shell

これらのそれぞれは改行文字にtr置き換えられます。:


あなたは次の効果的な方法に精通しています。

while IFS= read -r line; do

whileはコマンドの最初の単語であり、割り当てが適用されるIFSため、readすべてがうまく機能します。

おすすめ記事