zsh: 改行で区切られた項目の for ループ

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"。どうすればいいですか?

答え1

zshから改行に分割するには、次のものを使用できます。f パラメータ拡張フラグ(fのためラインf需要)は次の略語ですps:\n:

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

-splittingを使用することもできます$IFS。ここではzsh(他のBourne様シェルとは異なり)使用する必要があります。$=param通事論$=はさみのように見えました):

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

答え2

変数は配列ではなく文字列です。改行文字が含まれていることは関係ありません。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

これは本質的に見苦しい結果をもたらします(参照:こここれが悪い考えである理由):

% 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% 

関連情報