【发布时间】:2010-06-24 18:49:25
【问题描述】:
我需要从 bash 脚本处理库的共享库依赖项。 for 命令逐字处理:
for DEPENDENCY in `otool -L MyApplication | sed 1d`
do
...
done
逐行处理结果的方法是什么?
【问题讨论】:
标签: shell
我需要从 bash 脚本处理库的共享库依赖项。 for 命令逐字处理:
for DEPENDENCY in `otool -L MyApplication | sed 1d`
do
...
done
逐行处理结果的方法是什么?
【问题讨论】:
标签: shell
【讨论】:
while read i; do ... done < <(otool -L MyApplication | sed 1d)
read -r i 读取没有此类修改的行。
echo "line: $i" 会阻止这种情况发生。
printf ' foo\\bar \n'|read a; echo "<$a>",然后使用read -r。
IFS= read -r i 的最佳实践调用中清除 IFS 的行为,消除了前导和尾随空格修剪。
otool -L MyApplication | sed 1d | while read line ;
do
# do stuff with $line
done
【讨论】:
尝试将内部字段分隔符更改为换行符。默认情况下,bash 在使用 for 循环时会用空格分隔标记。您的 IFS 设置将使 for 循环根据 IFS 等于的任何字符串拆分标记(因此用换行符而不是用空格分隔标记)。
[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
【讨论】:
现代 bash 方式:
while read i; do
...
done < <(otool -L MyApplication | sed 1d)
注意:上面的两个“
【讨论】:
您可以使用awk 逐行处理事物。究竟什么是最好的方法取决于你想要做什么。
【讨论】:
你也可以用 awk 来做。无需使用 bash for 循环
otool -L MyApplication | awk 'NR>1
{
# do your stuff here since awk process line by line.
}'
【讨论】: