有人可以解释一下此命令返回错误的原因(在Solaris ksh上):
if [ "(" = "(" ]; then echo 1;fi;
ksh: test: argument expected
使用bash同样可以,并按预期回应“1” 此外,使用[[]]即可。
问题似乎是第一个“(”
答案 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。