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
我在脚本中使用了“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