In a bash
脚本,我必须检查多个文件是否存在。
我知道一种尴尬的方法,如下所示,但这意味着我的主程序必须位于那个丑陋的嵌套结构中:
if [ -f $FILE1 ]
then
if [ -f $FILE2 ]
then
echo OK
# MAIN PROGRAM HERE
fi
fi
以下版本不起作用:
([ -f $FILE1 ] && [ -f $FILE2 ]) || ( echo "NOT FOUND"; exit 1 )
echo OK
它打印
NOT FOUND
OK
有没有一种优雅的方法可以做到这一点?
UPDATE:查看已接受的答案。另外,在优雅方面我很喜欢乔纳森·莱弗勒的回答 https://stackoverflow.com/questions/572206/bash-how-do-i-check-if-certain-files-exist/572546#572546:
arg0=$(basename $0 .sh)
error()
{
echo "$arg0: $@" 1>&2
exit 1
}
[ -f $FILE2 ] || error "$FILE2 not found"
[ -f $FILE1 ] || error "$FILE1 not found"
怎么样
if [[ ! ( -f $FILE1 && -f $FILE2 ) ]]; then
echo NOT FOUND
exit 1
fi
# do stuff
echo OK
See help [[
and help test
对于可用的选项[[
风格测试。另请阅读此常见问题解答条目 http://mywiki.wooledge.org/BashFAQ/031.
您的版本无法运行,因为(...)
产生一个新的子 shell,其中exit
被执行。因此它只影响该子 shell,而不影响正在执行的脚本。
相反,执行以下命令{...}
在当前外壳中。
我还应该注意,您必须引用这两个变量,以确保没有不必要的扩展或分词(它们必须作为一个参数传递给[
).
[ -f "$FILE1" ] && [ -f "$FILE2" ] || { echo "NOT FOUND"; exit 1; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)