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
すべてがうまく機能します。
答え2
シェルマクロの割り当ては、単純なコマンド(たとえばread
)の前には許可されますが、複合ステートメント(たとえば)の前には許可されませんfor
。
推奨用途:
OIFS=$IFS
IFS=:
some complex commands
IFS=$OIFS