web-dev-qa-db-ja.com

zsh:改行区切りのエントリに対するforループ

変数があります:

❯ echo $numholds     
409503
409929
409930
409932
409934
409936
409941
409942
409944
409946

Forループを実行したいのですが、改行区切りが機能しません。

❯ for num in $numholds; do
echo $num ,
echo New Item!
> done                         
409503
409929
409930
409932
409934
409936
409941
409942
409944
409946 ,
New Item!

これは、IFS=$"\n \t"。どうすればこれを機能させることができますか?

3
James Wright

Zshの改行で分割するには、fパラメータ展開フラグf forline feedを使用します。 ps:\n:の略:

for num (${(f)numholds}) print -r New item: $num

$IFS- splittingを使用することもできます。これは、zshで(他のBourneのようなシェルとは異なり)、 $=param構文を使用して明示的にパラメータ拡張を要求する必要があります$=は、はさみのペアのように見えます):

for num ($=numholds) print -r New item: $num
5

変数は配列ではなく文字列です。改行が含まれていることは関係ありません。 for num in $numholdsは、格納されている方法であるため、全体を単一の値として認識します。

簡単な回避策は、whileループと<<< here-stringコンストラクトを使用してフィードすることです。

% while read num; do echo "$num"; echo "New Item"; done <<<"$numholds"
409503
New Item
409929
New Item
409930
New Item
409932
New Item
409934
New Item
409936
New Item
409941
New Item
409942
New Item
409944
New Item
409946
New Item

これは基本的に醜いものと同等です(なぜこれが悪い考えであるかについては here を参照してください):

% for num in $(echo "$numholds"); do echo $num; echo "new item"; done
409503
new item
409929
new item
409930
new item
409932
new item
409934
new item
409936
new item
409941
new item
409942
new item
409944
new item
409946
new item

最後に、代わりに変数を配列にすることができます。

numArray=($(echo "$numholds"))

これで、必要な構成を使用できます。

% for num in "${numArray[@]}"; do echo $num; echo "new item"; done                   
409503
new item
409929
new item
409930
new item
409932
new item
409934
new item
409936
new item
409941
new item
409942
new item
409944
new item
409946
new item
tpad% 
2
terdon