Shell脚本在执行exit命令后仍然继续运行。

3
我的shell脚本如下所示:
#!/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...

当我以非root用户运行上述脚本时,它会打印“这个脚本…”的消息,但它不会在那里退出,它会继续执行剩余的脚本。我做错了什么?
注意:我不想使用if条件。
3个回答

5

您正在子shell中运行echoexitexit调用仅会离开该子shell,这有点毫无意义。

请尝试使用以下命令:

#! /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版本更安全(在我看来更易读,更易于维护)。

经过编辑,虽然我不明白为什么你要避免使用 if - Mat
@Mat,至少在bash中,echo的返回值始终为0。 - paxdiablo
@paxdiablo:POSIX允许echo失败。不过我不确定如何/何时会失败,而且这也不是我太担心的事情——不确定你能从失败的echo中恢复什么... - Mat
POSIX可能会失败(如果您将重定向到填满设备的设备),但bash_builtins手册明确禁止这样做。不过这并不重要,反正这种情况本来就不应该出现在一行中。我更喜欢您的多行版本 :-) - paxdiablo
为什么你不想使用if语句呢?这正是if语句的用途。(如果你更注重简洁而非易读性,你可以将if语句写在一行上。) - Keith Thompson

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.

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


1

我会这样写:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接