即使在退出命令后,Shell脚本仍继续运行

时间:2011-10-26 06:10:44

标签: linux shell redhat

我的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 个答案:

答案 0 :(得分:5)

您在子广告中正在运行echoexit。退出调用只会留下子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版本更安全(更易读,更易于维护IMO)。

答案 1 :(得分:1)

我认为您需要&&而不是||,因为您希望回显退出(而不是echo 退出)。

此外,(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.

我相信这就是你要找的东西。

答案 2 :(得分:1)

我会把它写成:

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

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