如何逐行处理shell中命令的输出?

时间:2010-06-24 18:49:25

标签: shell

我需要从bash脚本处理库的共享库依赖项。 for命令逐字处理:

for DEPENDENCY in `otool -L MyApplication | sed 1d`
do
    ...
done

逐行处理结果的方法是什么?

7 个答案:

答案 0 :(得分:29)

您应该使用read命令。

otool -L MyApplication | sed 1d | \
while read i
do
  echo "line: " $i
done

有关read builtin及其选项的说明,请参阅bashref。您还可以查看以下tutorial,了解将readfor结合使用的示例。

答案 1 :(得分:9)

otool -L MyApplication | sed 1d | while read line ;
do
  # do stuff with $line
done

答案 2 :(得分:3)

尝试将内部字段分隔符更改为换行符。默认情况下,bash将在使用for循环时按空格分隔标记。您的IFS设置将使for循环根据IFS等于的任何字符串拆分标记(从而通过换行而不是按空格分隔列表标记)。

[bash ] $ IFS="
"
[bash ] $ for DEPENDENCY in `otool -L MyApplication | sed 1d`
do
    ....
done

答案 3 :(得分:1)

您必须使用shell builtin read,但要注意包含空格和制表符的行。我建议在本地更改$IFS的价值:

 otool -L MyApplication | sed 1d | \
 while IFS= read i; do
     echo "line: " $i
 done

答案 4 :(得分:0)

您可以使用awk按行进行处理。究竟什么是最好的方式取决于你想要做的事情。

答案 5 :(得分:0)

你也可以这样做。无需使用bash for loop

otool -L MyApplication | awk 'NR>1
{
  # do your stuff here since awk process line by line.
}' 

答案 6 :(得分:0)

现代 bash 方式:

while read i; do
    ...
done < <(otool -L MyApplication | sed 1d)

注意:上面的两个“<”不是拼写错误,这是正确的语法。