我需要从一个Bash脚本中处理一个库的共享库依赖项。 for
命令逐字逐句地处理:
for DEPENDENCY in `otool -L MyApplication | sed 1d`
do
...
done
如何逐行处理结果?
我需要从一个Bash脚本中处理一个库的共享库依赖项。 for
命令逐字逐句地处理:
for DEPENDENCY in `otool -L MyApplication | sed 1d`
do
...
done
如何逐行处理结果?
while read i; do ... done < <(otool -L MyApplication | sed 1d)
- Gordon Davissonread -r i
读取行时不进行此类修改。 - Jensread -r
,而是read
会吃掉前后的空格和反斜杠。试试这个命令:printf ' foo\\bar \n'|read a; echo "<$a>"
,然后再用read -r
。 - JensIFS= read -r i
时清除IFS
的行为消除了前导和尾随空格修剪。 - Charles Duffy{ read _; while IFS= read -r i; do echo "line: $i"; done; }
替换 sed 1d | ...
会稍微提高效率 -- 这样我们在管道中就不需要一个额外的可执行文件来启动并循环整个数据流,只需让 bash 自己读取标题到 _
中,然后将其抛弃,再进入循环即可。 - Charles Duffyotool -L MyApplication | sed 1d | while read line ;
do
# do stuff with $line
done
[bash ] $ IFS="
"
[bash ] $ for DEPENDENCY in `otool -L MyApplication | sed 1d`
do
....
done
您需要使用shell内置的read
,但需要注意包含空格和制表符的行。我建议本地更改$IFS
的值:
otool -L MyApplication | sed 1d | \
while IFS= read i; do
echo "line: $i"
done
[编辑:采纳Charles的建议]
read
中更改了IFS
,但对于未引用的扩展,它仍保持其先前/默认值。将$i
在echo
中移入引号(echo "line: $i"
)以避免字符串分割和全局扩展。另请参见I just assigned a variable, but echo $variable
shows something else!。 - Charles Duffy现代的Bash方法:
while read i; do
...
done < <(otool -L MyApplication | sed 1d)
while IFS= read -r i; do
时,如果你不清除 IFS,那么前导和尾随的空格将被删除;如果你不使用 -r
,则反斜杠会被解释。 - Charles Duffy你也可以使用awk来完成,不需要使用bash的循环
otool -L MyApplication | awk 'NR>1
{
# do your stuff here since awk process line by line.
}'
您可以使用 awk
在每行的基础上处理事情。最佳方法取决于您要做什么。