【发布时间】:2015-04-03 05:33:57
【问题描述】:
我使用这个循环来遍历文件,或者,如果没有文件,读取标准输入:
#!/bin/bash
set -e
cat "$@" | while read arr ; do
echo "Got this line ${arr}"
done
问题是如果文件不存在,它不会出错。
您可以在此处查看完整示例: https://github.com/StackExchange/blackbox/blob/master/tools/mk_rpm_fpmdir
cat 如果未找到任何文件,则返回错误代码 1。但是该错误不会导致程序停止。
如果找不到文件,我如何遍历 $@ 并失败?
【问题讨论】:
-
三引号对 shell 没有任何意义,所以
"""$@"""只是"$@",每边都有额外的空字符串。这也不是以任何方式“迭代”。cat只是将所有文件中的内容转储到连续流中,直到完成。这没有失败的原因是因为set -e仅适用于“简单命令”。见stackoverflow.com/q/25794905/258523。 -
除非设置了
shopt -s pipefail,否则管道的右侧(而不是左侧)决定了整个管道的退出状态。 -
bash 成语
cat """$@"""的意思是“所有的 args,但如果它们包含空格,它仍然可以使用”。 -
@TomOnTime,
cat "$@"意思相同。多余的引号没有效果。 -
顺便说一句,
read -a arr然后取消引用"$arr"只会给你数组的第一个元素,而不是它的完整内容。您需要使用"${arr[@]}"来获取完整的内容。
标签: bash