2009-08-19 58 views
0

能有人請解釋爲什麼這個命令返回一個錯誤(在Solaris KSH):測試失敗「的說法預期」比較時「(」

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

同樣使用bash是確定的,和回聲「 1" 預期
此外,使用[[]]是OK。

這個問題似乎是第一 「(」

+0

可悲的是,該代碼適用於我的ksh。 – 2009-08-19 10:18:09

+0

有趣的是,也許是在我的ksh的錯誤(Solaris 10上) – 2009-08-19 10:24:14

+0

上面的代碼工作正常上與OS一起提供的ksh X – 2009-08-19 11:16:39

回答

1

該命令似乎對我的工作KSH。

然而,IIRC在KSH它建議使用[[]]而不是[]。因此,對於便攜式解決方案,我建議你把它寫成:

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

做然而要注意[[]]是[]在通配符擴展都沒有做細微的差別。見http://www.bolthole.com/solaris/ksh-builtins.html#test

更新

爲了更好的移植到不同的炮彈,我傾向於使用內置測試命令,在KSH應該爲[[]]完全相同的效果。

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

我平時儘量不使用[[]],因爲它是不可移植的(以 慶典,反正) – 2009-08-19 10:27:58

+0

bash的支持[[]] – 2009-08-19 10:47:09

+0

哎呀,我的錯誤。不管怎麼樣 – 2009-08-19 11:21:50

1

請問如果你改變了雙引號爲單引號它的工作 - 即

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

編輯補充:我剛纔已經能夠重新創建一個數字UNIX問題KSH。單引號不要在此平臺上工作,要麼,但逃避括號做工作:

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

根據使ksh的man page,它指出:

以下字符有 特殊含義在外殼和造成 終止字,除非 報價:

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

...並繼續定義更多的解析規則。看來,(被解釋爲引用,即使(奇怪的特殊字符),因此對於逃逸的要求。如果你輸入「set -x」在命令行中嘗試你的面前,如果,你就會清楚地看到外殼是什麼想做發送到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及更高版本。在數字UNIX,實現是KSH-88。

+0

得到了同樣的錯誤,謝謝 - 至少我不會生氣,而其他人會看到這個問題。我無法逃避它,因爲使用的實際代碼是在文件讀取循環中,並且使用了一個變量。即如果[「$ var」=「測試」] – 2009-08-19 12:26:12

+0

喬 - 我剛剛嘗試這樣做:['''$ var「='\\('] ...這似乎工作。 「$ var」之前的'\'符合預期,現在我不知道你實例中$ var的內容是什麼,但是你可能會想出一個基於此的解決方案嗎? – 2009-08-19 15:52:08

+0

OK ,謝謝 - var的內容是「(」,因此是問題,我只是想爲[[]]解決方案 - 可能不會讓將來的維護者感到困惑。 – 2009-08-20 07:56:29