如何检查Bash中是否存在某些文件?
在如何检查Bash中是否存在某些文件?,bash,shell,error-handling,Bash,Shell,Error Handling,在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
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
有没有一种优雅的方法可以做到这一点
更新:查看接受的答案。此外,就优雅而言,我喜欢:
怎么样
if [[ ! ( -f $FILE1 && -f $FILE2 ) ]]; then
echo NOT FOUND
exit 1
fi
# do stuff
echo OK
请参阅帮助[[
和帮助测试
,了解可用于[[
样式测试的选项。另请阅读
您的版本不起作用,因为(…)
生成了一个新的子shell,在其中执行退出
。因此,它只影响该子shell,而不影响正在执行的脚本
相反,以下操作可以在当前shell中的{…}
之间执行命令
我还应该注意,您必须引用这两个变量,以确保没有不必要的扩展或分词(它们必须作为一个参数传递给[
)
我想你在寻找:
if [ -f $FILE1 -a -f $FILE2 ]; then
echo OK
fi
请参阅
人工测试
,了解有关可以在[]
中放置哪些内容的更多详细信息。您可以列出文件并在循环中检查它们:
file_list='file1 file2 wild*'
for file in $file_list; do
[ -f $file ] || exit
done
do_main_stuff
我通常在以下方面使用变体:
arg0=$(basename $0 .sh)
error()
{
echo "$arg0: $@" 1>&2
exit 1
}
[ -f $FILE2 ] || error "$FILE2 not found"
[ -f $FILE1 ] || error "$FILE1 not found"
让shell脚本有一个单一的退出点并没有什么特别的优点——也没有什么坏处,但是致命的错误也可能会终止脚本
唯一的争论点是是否在退出之前诊断尽可能多的问题,还是只诊断第一个问题。平均而言,只诊断第一个问题要容易得多
file_list='file1 file2 wild*'
for file in $file_list; do
[ -f $file ] || exit
done
do_main_stuff
arg0=$(basename $0 .sh)
error()
{
echo "$arg0: $@" 1>&2
exit 1
}
[ -f $FILE2 ] || error "$FILE2 not found"
[ -f $FILE1 ] || error "$FILE1 not found"