![zsh:for 循环换行符分隔的条目](https://linux22.com/image/167580/zsh%EF%BC%9Afor%20%E5%BE%AA%E7%8E%AF%E6%8D%A2%E8%A1%8C%E7%AC%A6%E5%88%86%E9%9A%94%E7%9A%84%E6%9D%A1%E7%9B%AE.png)
我有一个变量:
❯ 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
答案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%