如何在bash中将列表传递给for
?
我试过
echo "some
different
lines
" | for i ; do
echo do something with $i;
done
但这不起作用。我还尝试使用man
找到解释,但没有man for
我知道,我可以使用while
代替,但我想我曾经看过一个for
的解决方案,他们没有定义变量,但可以在循环中使用它
答案 0 :(得分:10)
for
遍历一个单词列表,如下所示:
for i in word1 word2 word3; do echo "$i"; done
使用while read
循环迭代行:
echo "some
different
lines" | while read -r line; do echo "$line"; done
以下是bash中阅读行的some useful reading。
答案 1 :(得分:10)
这可能有用,但我不推荐它:
echo "some
different
lines
" | for i in $(cat) ; do
...
done
$(cat)
会展开stdin
上的所有内容,但如果echo
中的某一行包含空格,for
会认为这两个字。所以最终可能会破裂。
如果你想在循环中处理单词列表,那就更好了:
a=($(echo "some
different
lines
"))
for i in "${a[@]}"; do
...
done
说明:a=(...)
声明一个数组。 $(cmd...)
扩展为命令的输出。它仍然容易受到空白的影响,但如果你引用得当,这可以解决。
"${a[@]}"
扩展为数组中正确引用的元素列表。
注意:for
是内置命令。请改用help for
(在bash中)。
答案 2 :(得分:0)
这似乎有效:
for x in $(echo a b c); do
echo $x
done
答案 3 :(得分:0)
这不是管道,但非常相似:
args="some
different
lines";
set -- $args;
for i ; do
echo $i;
done
如果没有for
,则$@
默认为in seq
。
也许你可以以某种方式缩短这一点?