将字符串列表传递给for循环

时间:2015-04-10 11:23:25

标签: bash

如何在bash中将列表传递给for

我试过

echo "some
different
lines
" | for i ; do 
  echo do something with $i; 
done

但这不起作用。我还尝试使用man找到解释,但没有man for

编辑:

我知道,我可以使用while代替,但我想我曾经看过一个for的解决方案,他们没有定义变量,但可以在循环中使用它

4 个答案:

答案 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

也许你可以以某种方式缩短这一点?