【问题标题】:How do you process the output of a command in the shell line-by-line?如何在 shell 中逐行处理命令的输出?
【发布时间】:2010-06-24 18:49:25
【问题描述】:

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

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

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

【问题讨论】:

标签: shell


【解决方案1】:

您应该使用read 命令。

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

请参阅bashref 以了解 read 内置函数及其选项的说明。您还可以查看以下tutorial 以了解将readfor 结合使用的示例。

【讨论】:

  • 警告:如果您需要在 while 循环中设置变量(即存储您在 otool 的输出中找到的内容),它们将在循环退出后立即消失,因为它是管道的一部分并因此运行在一个子壳中。在 bash 中,您可以通过一些重新排列来解决这个问题:while read i; do ... done < <(otool -L MyApplication | sed 1d)
  • 另一个警告:这会删除很多空格和反斜杠。使用read -r i 读取没有此类修改的行。
  • @Jens,不,它是 echo 命令吃空间。 echo "line: $i" 会阻止这种情况发生。
  • @JamesMorris 不,这是读取前导和尾随空格和反斜杠的内容。尝试printf ' foo\\bar \n'|read a; echo "<$a>",然后使用read -r
  • @Jens, ...这是在 IFS= read -r i 的最佳实践调用中清除 IFS 的行为,消除了前导和尾随空格修剪。
【解决方案2】:
otool -L MyApplication | sed 1d | while read line ;
do
  # do stuff with $line
done

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        现代 bash 方式:

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

        注意:上面的两个“

        【讨论】:

          【解决方案6】:

          您可以使用awk 逐行处理事物。究竟什么是最好的方法取决于你想要做什么。

          【讨论】:

            【解决方案7】:

            你也可以用 awk 来做。无需使用 bash for 循环

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

            【讨论】:

              猜你喜欢
              • 2020-03-12
              • 1970-01-01
              • 1970-01-01
              • 2012-02-28
              • 1970-01-01
              • 2021-06-07
              • 2010-11-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多