比较“(”)时,测试失败并带有“参数预期”

时间:2009-08-19 10:11:29

标签: ksh

有人可以解释一下此命令返回错误的原因(在Solaris ksh上):

if [ "(" = "(" ]; then echo 1;fi;
ksh: test: argument expected

使用bash同样可以,并按预期回应“1” 此外,使用[[]]即可。

问题似乎是第一个“(”

2 个答案:

答案 0 :(得分:1)

该命令似乎适用于我的ksh。

但是,IIRC在ksh中建议使用[[]]而不是[]。所以对于便携式解决方案,我建议你把它写成:

if [[ "(" = "(" ]]; then echo 1; fi;

请注意,[[]]与[]略有不同,因为未完成通配符扩展。见http://www.bolthole.com/solaris/ksh-builtins.html#test

<强>更新

为了更好地移植到不同的shell,我倾向于使用内置的 test 命令,该命令在ksh中应该与[[]]具有完全相同的效果。

if test "(" = "("; then echo 1; fi

答案 1 :(得分:1)

如果将双引号更改为单引号(即。,

),它是否有效
if [ '(' = '(' ]; then echo 1;fi;

已编辑添加:我刚刚能够使用Digital UNIX ksh重新创建问题。单引号在此平台上不起作用,但转义括号确实有效:

if [ '\(' = '\(' ]; then echo 1;fi;

根据ksh的手册页,它说:

  

以下字符有   壳的特殊含义和原因   终止一个词,除非   引用:

   ; & ( ) | ^ < > <newline> <space> <tab>

...继续定义更多解析规则。看起来(即使被引用(奇怪)也被解释为一个特殊字符,因此需要转义。如果在尝试if之前在命令行输入“set -x”,你会看到确切的shell尝试发送给stderr的是什么,前面带有'+'符号,这可能有助于跟踪;例如:

$ set -x
$ if [ '(' = '(' ]; then echo 1;fi;
+ [ ( = ( ]
ksh: test: argument expected
$
$ if [ '\(' = '\(' ]; then echo 1;fi;
+ [ \( = \( ]
+ echo 1
1
$

它可能依赖于ksh实现 - 例如,ksh-88 vs ksh-93及更高版本。在Digital UNIX上,实现是ksh-88。