我将以下shell脚本保存在名为foo.sh的文件中。
username=$1
if [ -n "$username" ]
then
echo username: "$username"
fi
我在AIX 5.3机器上运行此脚本。
$ echo $SHELL
/usr/bin/ksh
$ sh foo.sh humpty
username: humpty
$ sh foo.sh =
foo.sh[2]: test: 0403-004 Specify a parameter with this command.
$ ksh foo.sh =
foo.sh[2]: test: 0403-004 Specify a parameter with this command.
$ ksh93 foo.sh =
username: =
$ bash foo.sh =
username: =
如果您想了解版本。
$ ksh93 -c 'echo ${.sh.version}'
Version M-12/28/93e
$ bash --version
GNU bash, version 3.2.16(1)-release (powerpc-ibm-aix5.2.0.0)
Copyright (C) 2005 Free Software Foundation, Inc
我找不到确定ksh
版本的方法。
如您所见,当我指定ksh
作为输入时,脚本会导致=
出错。我可以在AIX 5.3上使用ksh重现此错误,但在AIX 5.3上不能使用bash或ksh93重现此错误。也许,当AIX上的ksh看到[ -n = ]
时,它期望它是对两个相同字符串的测试。
是否违反POSIX.1-2004以及POSIX.1-2008的ksh行为? http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html处的文件清楚地说明了这一点。
确定运算符优先级的算法 应生成的返回值基于数量 参加测试的论据。 (但是,当使用" [...]"表格时, 右括号最终论证不计算在内 算法。)
在以下列表中,$ 1,$ 2,$ 3和$ 4表示参数 提交测试:
0个参数: 退出false(1)。
1个论点: 如果$ 1不为null,则退出true(0);否则,退出false。
2个论点:
如果$ 1是'!',如果$ 2为空,则退出true,如果$ 2不为空则退出。
如果$ 1是一元主要,如果一元测试为真,则返回true,false 如果一元测试是假的。
否则,产生未指定的结果。
在这种情况下,[ -n = ]
确实有2个参数,第一个参数确实是一元一次,因此它应该测试=
是非零字符串并退出true而不是抛出错误。