2011-10-26 54 views
3

我的外壳脚本,如下所示:壳牌脚本继续甚至退出命令之后运行

#!/bin/bash 

# Make sure only root can run our script 
[ $EUID -ne 0 ] && (echo "This script must be run as root" 1>&2) || (exit 1) 

# other script continues here... 

当运行以上非根用户脚本,它打印消息“此脚本...”,但它没有退出那里,它继续与剩余的脚本。我究竟做错了什么?

注:我不想使用条件。

回答

5

您正在运行echoexit在subhell中。退出呼叫只会留下该子外壳,这有点毫无意义。

与尝试:

#! /bin/sh 
if [ $EUID -ne 0 ] ; then 
    echo "This script must be run as root" 1>&2 
    exit 1 
fi 
echo hello 

如果由于某种原因,你不想要一个if条件下,只需使用:

#! /bin/sh 
[ $EUID -ne 0 ] && echo "This script must be run as root" 1>&2 && exit 1 
echo hello 

注:没有()和固定的布尔条件。警告:如果echo失败,该测试也将无法退出。 if版本更安全(更易读,更容易维护IMO)。

+0

我不想使用条件...我不能在一行代码中使用它吗? – Mike

+0

编辑,但我不明白你为什么要避免'如果'。 – Mat

+0

@Mat,至少带'bash','echo'的返回值总是0. – paxdiablo

1

我想你需要&&而非||,因为你想呼应退出(不回退出)。

此外(exit 1)将运行一个退出而不是退出当前shell的子shell。

下面的脚本说明你需要:

#!/bin/bash 
[ $1 -ne 0 ] && (echo "This script must be run as root." 1>&2) && exit 1 
echo Continuing... 

./myscript 0运行这给你:

Continuing... 

./myscript 1为您提供:

This script must be run as root. 

我相信这就是你正在寻找。

+0

它不工作..它仍然继续 – Mike

+0

@Mike,请参阅subhell的更新。 – paxdiablo

1

我会写为:

(($EUID != 0)) && { echo "This script must be run as root" 1>&2; exit 1; } 

使用{ }进行分组,这在当前的shell执行。请注意,大括号和结尾分号周围的空格是必需的。