2013-10-25 64 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

将是一个很好的方法来做到这一点。