如果存在某个文件,我只想检查 bash。
在此页面上提到了两个选项可用于if
:
[ -a FILE ]
- 如果文件存在则为真[ -e FILE ]
- 如果文件存在则为真它们是等效的还是它们之间有什么区别?
该-a
选项与 , 相同-e
,并且存在是为了与 Korn Shell 兼容,Bash 从中借用了很多功能。
根据 POSIX 标准,命令描述test
(链接):
早期的提案使用了 KornShell -a 主运算符(具有相同的含义),但后来将其更改为 -e,因为人们担心人们很可能将 -a 主运算符与 -a 二元运算符混淆。
旁注:二进制表示出现在两个变量之间的标志[ $var1 -a $var2 ]
,主要表示首先出现在参数列表中,如下所示[ -a $var ]
事实上,Korn Shell(ksh93
此处)手册指出:
-一份文件
与下面的-e 相同。这已经过时了。
您引用的 TLDP 文章test
中使用的命令使用bashbuilt-in ,但是尽管文档中缺少该选项,但该选项也存在:test
/usr/bin/test
$ /usr/bin/test -a /etc/passwd && echo 1
1
Run Code Online (Sandbox Code Playgroud)
只要您 100% 确定您的脚本将在 Bash 或 Korn Shell 上使用 - 那么就可以了。但是,如果您力求脚本的可移植性并希望以 Right Way TM编写脚本,则应该使用-e
. 标准的 Ubuntu shell,/bin/sh
实际上是 Dash - Debian Amquist Shell - 不认为这是有效的选项:
$ dash
$ test -a /etc/passwd
dash: 1: test: -a: unexpected operator
Run Code Online (Sandbox Code Playgroud)
如果您想将脚本移植到其他平台,则使用并-a
不能保证安全/usr/bin/test
,您应该坚持使用,-e
因为它实际上是由 POSIX 标准指定的。