我正在编写一个 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
错误。[
bash
file_name='='
请注意,即使这不会改变逻辑,我还是-z
首先移动了检查,因为它不涉及对系统的任何查询,因此成本较低。我已将第一个替换echo
为echo>&2
将错误消息发送到 stderr 而不是 stdout。