linux - 为什么在存在目标的情况下,bash 中的否定文件存在检查会返回奇怪的结果?

标签 linux bash shell if-statement

如果 bash 中不存在文件,我希望使用以下命令执行操作:

if [ ! -a $HOME/.some_directory ] ; then 
     # do something
fi

然而,无论 $HOME/.some_directory 是否存在,#do something 部分总是被执行。

我创建了一个小测试,其中我尝试了所有情况:

  • 检查不存在的目录
  • 否定不存在的目录检查
  • 存在目录检查
  • 否定存在的目录检查(这是唯一返回“无效”结果的检查)- 或者我做错了什么

结果截图如下:

enter image description here

注意事项:

最佳答案

此行为是 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/

相关文章:

linux - 仅特定用户 Shell 脚本的 USERID、PID、TIME 和 COMMAND

linux - 如何删除 curl 输出中的特定字符

linux - 人类可读、递归、排序的最大文件列表

python - 有什么方法可以使用 'nmap' 端口扫描器,在我的 Django 应用程序上生成和输出结果

python - Centos 7-flask 授予查看其他用户的 bash 历史记录的权限

bash - 根据列值将单个文件分成多个

php - 从 php 更改文件夹所有权

c++ - 不允许第二个 setuid

c# - Ubuntu 上的 ASP.NET

linux - find -exec 无法识别参数