2011-10-26 160 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執行。請注意,大括號和結尾分號周圍的空格是必需的。