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

您还可以使用$IFS-splitting ,其中zsh(与其他类似 Bourne 的 shell 相反)您必须使用$=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% 

相关内容