2012-10-04 29 views
0
#! /bin/bash 

if [ !\(-f new.bash -o -d new.bash\) ] 
then 
    echo "Neither" 
else 
    echo "yes" 
fi 

它的工作原理,但留下一個錯誤:爲什麼shell腳本給我提供了太多的參數錯誤?

/file_exist_or_not.bash  
./file_exist_or_not.bash: line 3: [: too many arguments 
yes 

BTW,爲什麼內parenthesises需要轉義?

回答

3

Bash使用空格分隔令牌,然後將令牌作爲參數傳遞給命令(在本例中命令爲test)。有關更多詳細信息,請參閱手冊頁test

要解決,您需要在操作數之間添加空格。

if [ ! \(-f new.bash -o -d new.bash \) ] 
+0

感謝您的解釋,這對我有意義,你能告訴我爲什麼內括號需要逃脫嗎? – mko

+1

否則bash將首先看到內部圓括號,並嘗試解釋它們本身,而不是將它們傳遞給'test'。 –

+0

+1清除它 – mko

2

如果您正在使用bash,不介意放棄POSIX兼容,下面是一個簡單一點:

if [[ ! (-f new.bash || -d new.bash) ]]; then 

可以使用||代替-o,和括號不需要逃脫。

+0

+1爲優雅的風格,什麼樣的外殼可能導致此語法的問題 – mko

相關問題