0

有人可以解释为什么这个命令会返回错误(在 Solaris ksh 上):

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

使用 bash 也可以,并按预期回显“1”
此外,使用 [[ ]] 也可以。

问题似乎是第一个“(”

4

2 回答 2

1

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

但是,ksh 中的 IIRC 建议使用 [[ ]] 而不是 []。因此,对于便携式解决方案,我建议您将其写为:

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

但是请注意,[[]] 与 [] 略有不同,因为没有进行通配符扩展。请参阅http://www.bolthole.com/solaris/ksh-builtins.html#test

更新

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

if test "(" = "("; then echo 1; fi
于 2009-08-19T10:20:34.823 回答
1

如果您将双引号更改为单引号,它是否有效 - 即,

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

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

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

根据 ksh 的手册页,它指出:

以下字符对 shell 具有特殊含义,除非引用,否则会导致单词终止:

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

...并继续定义更多解析规则。即使引用(奇怪地),似乎 ( 也被解释为特殊字符,因此需要转义。如果set -x在尝试 if 之前在命令行中键入 " " ,您将确切地看到 shell 正在尝试什么发送到 stderr 的 to do 前面带有一个“+”号,这可能有助于跟踪;例如:

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

可能它也取决于 ksh 实现——例如,ksh-88 与 ksh-93 及更高版本。在 Digital UNIX 上,实现是 ksh-88。

于 2009-08-19T11:59:35.730 回答