如何检查 Bash 中是否存在某些文件?

2024-04-05

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(使用前将#替换为@)

如何检查 Bash 中是否存在某些文件? 的相关文章

随机推荐