我对我们使用的 ksh93 测试限定符之一感到困惑。二十多年前,我们参加了“Unix Shell 编程 - 以 KornShell 为特色”课程。在该课程附带的手册中,它说如果文件存在,“-a filename”就会成功。从那时起我们就广泛使用“-a”。我最近发现这个链接,上面写着“-a”是一个用于测试的“二进制 AND 运算符”(我们在 AIX 7.1 上使用 ksh93),“man test”显示与该链接相同的输出。
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.cmds5/test.htm
现在该链接似乎是通用 AIX 链接。也就是说,对我来说,它不是特定于 ksh、csh、sh 等,所以我不确定它是如何应用的。
看来我们现有的代码确实按预期工作。这是我们目前如何使用它的示例。
if [[ -a filename ]]
then
....
fi
我意识到还有其他用于测试文件的限定符,但我想知道为什么“-a”似乎会检查是否存在,而联机帮助页表明它不会。
提前致谢。
答案1
从ksh
手册中:
Conditional Expressions. A conditional expression is used with the [[ compound command to test attributes of files and to compare strings. Field splitting and file name generation are not performed on the words between [[ and ]]. Each expression can be constructed from one or more of the following unary or binary expressions: string True, if string is not null. -a file Same as -e below. This is obsolete. -e file True, if file exists.
答案2
中存在的二进制文件test
(或)与可能是 shell 内置程序的二进制文件不同;请参阅 shell 的文档。如果您调用,或者实际上您可能正在调用 shell 内置函数而不是二进制文件,具体取决于 shell。以下不是 AIX 也不是它的 KSH,而是传家宝 bourne shell 或Mac OS X 上的,其中不支持或存在标志,但支持:[
PATH
[[
[[
test
[
mksh
sh
[[
-a
mksh
$ sh
$ [[ -a /etc/passwd ]] && echo yea
[[: not found
$ [ -a /etc/passwd ] && echo yea
test: argument expected
$ exit
$ [[ -a /etc/passwd ]] && echo yea
yea
$ [ -a /etc/passwd ] && echo yea
yea
$