aix ksh 中“if [-z $var]”的错误输出

Wrong output of " if [ -z $var ] " in aix ksh

我在脚本中使用了“if [-z $var]”,但是当我在 aix ksh 中运行它时,结果完全错误并且似乎有语法错误。

aixtest:/tmp# ls -a 
.   ..  a.sh    b.sh
aixtest:/tmp# ls -a | grep -i abc
aixtest:/tmp# all=`ls -a | grep -i abc`
aixtest:/tmp# echo $all

aixtest:/tmp# if [ -z $all ]; then echo "empty"; else echo "not empty"; fi;
ksh: test: 0403-004 Specify a parameter with this command.
not empty
aixtest:/tmp# if [ ! -z $all ]; then echo "not empty"; else echo "empty"; fi;
empty
aixtest:/tmp# oslevel -s 
6100-08-03-1339
aixtest:/tmp# echo $SHELL
/usr/bin/ksh

上面的脚本,$all应该是空的,但是输出是错误的,我得到一个错误说"ksh: test: 0403-004 Specify a parameter with this command."

之后我 运行 这个脚本在 HMC shell,这是一个 Linux 发行版,输出是正确的。

hscpe@IDCP780HMC1:~> ls -a
.   ..  a.sh    b.sh
hscpe@IDCP780HMC1:~> ls -a | grep -i abc
hscpe@IDCP780HMC1:~> all=`ls -a | grep -i abc`
hscpe@IDCP780HMC1:~> echo $all

hscpe@IDCP780HMC1:~> if [ -z $all ]; then echo "empty"; else echo "not empty"; fi;
empty
hscpe@IDCP780HMC1:~> if [ ! -z $all ]; then echo "not empty"; else echo "empty"; fi;
empty
hscpe@IDCP780HMC1:~> uname -a 
Linux IDCP780HMC1 2.6.32-358.23.2.79.hmc7_4p.x86_64 #1 SMP Wed Nov 12 12:50:34 CST 2014 x86_64 x86_64 x86_64 GNU/Linux
hscpe@IDCP780HMC1:~> echo $SHELL
/bin/hmcbash

那么问题出在哪里呢?我在 aix ksh 中误用了 "if" 语法还是错误?

在某些 shell 中,您必须引用变量。我想这就是这里发生的事情(尽管我从未使用过 AIX ksh)。

if [ -z "$all" ]; ...

它不起作用,因为 shell 将其解释为 if [-z]。要使其工作,您需要引用它。

此示例来自 AIX 7.1。

$ echo $SHELL
/usr/bin/ksh
$ all=""

未引用:

$ if [ -z $all ]; then echo "empty"; else echo "not empty"; fi;
ksh: test: argument expected
not empty

引用:

$ if [ -z "$all" ]; then echo "empty"; else echo "not empty"; fi;
empty