【问题标题】:How do I check if certain files exist in Bash?如何检查 Bash 中是否存在某些文件?
【发布时间】:2009-02-21 03:53:29
【问题描述】:

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

有没有一种优雅的方法可以做到这一点?

更新:查看接受的答案。另外,优雅方面我喜欢Jonathan Leffler's answer

arg0=$(basename $0 .sh)
error()
{
    echo "$arg0: $@" 1>&2
    exit 1
}

[ -f $FILE2 ] || error "$FILE2 not found"
[ -f $FILE1 ] || error "$FILE1 not found"

【问题讨论】:

    标签: bash shell error-handling


    【解决方案1】:

    怎么样

    if [[ ! ( -f $FILE1 && -f $FILE2 ) ]]; then
        echo NOT FOUND
        exit 1
    fi
    
    # do stuff
    echo OK
    

    请参阅help [[help test,了解可用于[[ 样式测试的选项。另请阅读this faq entry

    您的版本不起作用,因为(...) 生成了一个新的子shell,其中执行exit。因此它只影响该子shell,而不影响正在执行的脚本。

    以下工作改为在当前 shell 中执行{...} 之间的命令。

    我还应该注意,您必须引用这两个变量以确保不会进行不必要的扩展或分词(它们必须作为一个参数传递给 [)。

    [ -f "$FILE1" ] && [ -f "$FILE2" ] || { echo "NOT FOUND"; exit 1; }
    

    【讨论】:

      【解决方案2】:

      我想你正在寻找:

      if [ -f $FILE1 -a -f $FILE2 ]; then
          echo OK
      fi
      

      请参阅man test,了解有关您可以在[ ] 中添加内容的更多详细信息。

      【讨论】:

        【解决方案3】:

        您可以列出文件并循环检查它们:

        file_list='file1 file2 wild*'
        for file in $file_list; do
            [ -f $file ] || exit
        done
        
        do_main_stuff
        

        【讨论】:

          【解决方案4】:

          我通常在以下方面使用变体:

          arg0=$(basename $0 .sh)
          error()
          {
              echo "$arg0: $@" 1>&2
              exit 1
          }
          
          [ -f $FILE2 ] || error "$FILE2 not found"
          [ -f $FILE1 ] || error "$FILE1 not found"
          

          让 shell 脚本只有一个退出点并没有什么特别的好处 - 也没有什么坏处,但是致命的错误也可能会终止脚本。

          唯一的争论点是是在退出前诊断尽可能多的问题,还是只诊断第一个问题。平均而言,仅诊断第一个要容易得多。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-04
            • 2018-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-22
            • 2012-07-12
            • 2011-10-11
            相关资源
            最近更新 更多