如何检查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"