如果file_name为null,为什么[-f file_name]或[-e file_name]返回True?

时间:2018-09-30 03:43:44

标签: linux bash shell

我知道[ -f file ],如果我们将其用作条件检查,则检查 file 是否是普通文件,而不是目录或特殊文件;如果是,则条件变为真。 我也知道[ -e file ]检查文件是否存在;即使 file 是目录也是如此。

假设我有以下代码(保存为test.sh ),用于检查其是否为常规文件:

    #!/bin/bash 

    file=$1 
    if [ -e $file ] 
    then 
        echo "file exists" 
        if [ -f $file ] 
        then 
            echo "It's a regular file" 
        else 
            echo "It's not a regular file" 
        fi               
    else 
        echo "file doesn't exist" 
    fi

我正在跑步,如下所示:

    ./test.sh /etc/passwd

我的输出如下所示:

    file exists
    Its a regular file

如果我将无效的文件或目录作为参数传递:

    ./test.sh dsdsafds

仍然保持预期的输出:

    file doesn't exist

但是如果我运行的脚本没有任何参数,(意味着$1将为空):

    ./test.sh

两个if条件都得到满足,我的输出是:

    file exists
    Its a regular file

为什么会这样?即使$1为空,[ -e file ][ -f file ]如何为真?

我可以输出/打印这样的测试运算符返回的布尔值吗?

1 个答案:

答案 0 :(得分:4)

  1. 因为当[ -f $file ]为null时[ -f ]变成$file,所以表达式始终为true,因为-f不是空字符串。来自man bash

      

    test[使用一组基于参数数量的规则来评估条件表达式。

         

    0个参数
      表达式为假。

         

    1个参数
      仅当参数不为null时,表达式为true。

         

    2个参数
      如果第一个参数为!,则当且仅当第二个参数为null时,表达式才为true。 如果第一个参数是上面CONDITIONAL EXPRESSIONS下列出的一元条件运算符之一,则如果一元检验为true,则表达式为true。如果第一个参数不是有效的一元条件运算符,则表达式为错误。

         

    ...

    因此,引用变量file可以防止您遇到的错误(例如[ -f "$file" ])。

  2. [ ... ] && echo true || echo false