代码之家  ›  专栏  ›  技术社区  ›  Dave Mateer

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

  •  21
  • Dave Mateer  · 技术社区  · 14 年前

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

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

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

    6 回复  |  直到 14 年前
        1
  •  28
  •   tonio    14 年前

    你应该使用 read 命令。

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

    bashref 有关读取内置函数及其选项的描述。您还可以查看以下内容 tutorial 例如使用 阅读 for .

        2
  •  9
  •   Jim Lewis    14 年前
    otool -L MyApplication | sed 1d | while read line ;
    do
      # do stuff with $line
    done
    
        3
  •  3
  •   aoeu    14 年前

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

    [bash ] $ IFS="
    "
    [bash ] $ for DEPENDENCY in `otool -L MyApplication | sed 1d`
    do
        ....
    done
    
        4
  •  0
  •   Daniel Egeberg    14 年前

    你可以使用 awk 按行处理。但究竟什么是最好的方法取决于你想做什么。

        5
  •  0
  •   ghostdog74    14 年前

    你也可以把它弄糟。不需要使用bash for循环

    otool -L MyApplication | awk 'NR>1
    {
      # do your stuff here since awk process line by line.
    }' 
    
        6
  •  0
  •   Jérôme Pouiller    12 年前

    你得用炮弹 read ,但请注意包含空格和制表符的行。我建议局部改变 $IFS :

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