如果 bash 中不存在文件,我希望使用以下命令执行操作:
if [ ! -a $HOME/.some_directory ] ; then
# do something
fi
然而,无论 $HOME/.some_directory
是否存在,#do something
部分总是被执行。
我创建了一个小测试,其中我尝试了所有情况:
- 检查不存在的目录
- 否定不存在的目录检查
- 存在目录检查
- 否定存在的目录检查(这是唯一返回“无效”结果的检查)- 或者我做错了什么
结果截图如下:
注意事项:
~/bin
存在,而~/bina
不存在- 我使用的 bash 版本:
4.3.18
- 因为this SO question,我使用
$HOME
而不是~
- 我从 this SO question 中获取了文件存在性检查建议和 this reference
最佳答案
此行为是 specified in POSIX :
3 arguments:
- If $2 is a binary primary, perform the binary test of $1 and $3.
在你的例子中,$2
是一个 -a
,它是一个二元主运算符,所以 $1
和 $3
被视为二进制测试。单个单词的测试就像使用 -n
(“是非空字符串”)一样。
这意味着您的测试等同于:
[[ -n "!" && -n "$HOME/.some_directory" ]]
关于linux - 为什么在存在目标的情况下,bash 中的否定文件存在检查会返回奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434441/