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

hjqgdpho  于 2023-01-31  发布在  Shell
关注(0)|答案(7)|浏览(201)

我需要通过bash脚本处理一个库的共享库依赖项,for命令可以逐字处理:

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

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

368yc8dk

368yc8dk1#

您应该使用read命令。

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

阅读bashref了解read内置函数及其选项的描述,你也可以阅读下面的教程了解结合使用readfor的例子。

q9rjltbz

q9rjltbz2#

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

ulydmbyx3#

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

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

vm0i2vca4#

你必须使用shell内置的read,但是要小心包含空格和制表符的行。我建议在本地修改$IFS的值:

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

[Edit:应用了Charles的建议]

4szc88ey

4szc88ey5#

现代人抨击道:

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

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

lg40wkob

lg40wkob6#

您可以使用awk逐行处理,但最好的方法取决于您要做什么。

cygmwpex

cygmwpex7#

你也可以用awk来做,不需要使用bash for循环

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

相关问题