2013-10-25 65 views
5

當我運行這個bash腳本:慶典:非法數

if [ [$EUID -ne 0] ]; then 
    echo "This script must be run as root" 1>&2 
    exit 1 
else 

printf " whathever " 

exit 0 
fi 

我有這樣的錯誤:

./myScript: 15: [: Illegal number: [ 

你看不出什麼問題?

+3

看起來它試圖比較'[EUID'對'0]'而不是'$ EUID'對'0' – Havenard

+0

有趣的事實:http://en.wikipedia.org/wiki/Illegal_number – Akshay

回答

8

你有語法錯誤在你,如果條件下,利用這一點,如果條件:

if [ "$EUID" -ne 0 ]; 

或使用[[]]

if [[ "$EUID" -ne 0 ]]; 
+0

有什麼區別在使用'[]'和'[[]]'之間? – Havenard

+0

''''實際上是一個外部程序,因爲'/ bin/['和'[[]]'是測試評估的新BASH結構。 – anubhava

+1

使用第一個,我有這個錯誤:[:Illegal number: 使用第二,我有這個錯誤:[[:找不到 – 4m1nh4j1

2

你有語法錯誤在你,如果條件下,使用此如果條件:

if [ "$EUID" -ne 0 ]; 

或使用[[]]

if [[ "$EUID" -ne 0 ]]; 

如果使用KSH88 + /猛砸3+內部指令[[,它使用了一倍左右變量的操作數的報價是沒有必要的:

[ ~/test]$ [[ $var2 = "string with spaces" ]] && echo "OK" || echo "KO" 
OK 

代替外部命令test或他的貨叉[

[ ~/test]$ [ $var2 = "string with spaces" ] && echo "OK" || echo "KO" 
bash: [: too many arguments 
KO 
[ ~/test]$ [ "$var2" = "string with spaces" ] && echo "OK" || echo "KO" 
OK 

當然,你還可以根據操作數的類型來選擇運營商:

[ ~/test]$ var1="01" 
[ ~/test]$ [ "$var1" = "1" ] && echo "OK" || echo "KO" 
KO 
[ ~/test]$ [ "$var1" -eq "1" ] && echo "OK" || echo "KO" 
OK 
2

兩個建議除了其他人都已經指出了。

1)而不是做'else(因爲我們是root的代碼)fi',只需用'fi'替換'else'即可。一旦你測試了你關心的失敗情況並採取了適當的行動,就不需要繼續在條件的範圍內。

2)$ EUID是bashism,如果你想使這個移植到炮彈比如ksh,以取代它:

如果[$(ID -u)-ne 0];然後回聲「你不是根兄弟」;出口1; fi

將是一個很好的方法來做到這一點。