在单个 if 语句中链接多个条件时出错

在单个 if 语句中链接多个条件时出错

我正在编写一个 shell 脚本,脚本的一部分应该检查文件是否不存在或者提供的文件名是否为空(即没有提供文件名)。

这是我的代码 -

if ! [[ -e "$file_name" ] ||  [[ -z "$file_name" ]]  ; then
    echo "File doesn't exist"
    exit 2
else
    echo "ok"
fi

运行此脚本时,此代码片段给我带来语法错误或在应该运行 if 语句内的代码时运行 else 代码。

我知道我的代码确实存在一些语法问题(并且逻辑看起来也不太好?)。

我试图对此进行更多研究,但是,我似乎无法找到涵盖我所需的一切的好资源。

对此已经有很多问题,但问题是我不确定如何在其中一种情况下使用 not 运算符。

那我要改变什么呢?

答案1

您的代码中有一个拼写错误,您必须]关闭]]第一个[[...]]构造:

尝试:

if [[ -z "$file_name" || ! -e "$file_name" ]]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

这是 ksh 语法(现在包括 bash 在内的一些其他 shell 也支持)或:

if [ -z "$file_name" ] || [ ! -e "$file_name" ]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

这是标准sh+[语法。

Korn shell 的[实用程序和条件构造在各自的测试表达式中都被理解为否定运算符,但您也可以使用shell 运算符:[[...]]!!

if [ -z "$file_name" ] || ! [ -e "$file_name" ]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

[[...]]构造也有自己的||运算符。但是您也可以在两次调用||之间使用 shell 运算符,或者使用 shell 运算符而不是像您的方法中那样使用条件表达式运算符:[[...]]!!

if [[ -z "$file_name" ]] || ! [[ -e "$file_name" ]]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

[实用程序还-o具有或者运算符,但该运算符已被弃用,不应使用,因为它会导致不可靠的测试表达式。例如,当 时,shell的内置函数[ -z "$file_name" -o ! -e "$file_name" ]会失败并出现too many arguments错误。[bashfile_name='='

请注意,即使这不会改变逻辑,我还是-z首先移动了检查,因为它不涉及对系统的任何查询,因此成本较低。我已将第一个替换echoecho>&2将错误消息发送到 stderr 而不是 stdout。

相关内容