web-dev-qa-db-ja.com

条件付きステートメントでスクリプトを終了するにはどうすればよいですか?

ユーザーがルートでない場合に終了するbashスクリプトを書いています。条件は正常に機能しますが、スクリプトは終了しません。

[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)

&&ではなく;を使用しようとしましたが、どちらも機能しません。

52
Garrett Hall

あなたはそれをこのようにすることができます:

[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }

(最初のステートメントに算術2項演算子を使用した「通常の」条件式)、または:

(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }

(最初のテストの算術評価)。

変更に注意してください()-> {}-中括弧はnotサブシェルを生成します。 (探す man bash「サブシェル」の場合。)

53
Mat

これらのコマンドを囲む括弧は サブシェル を作成します。サブシェルは「スクリプトを実行するにはrootでなければならない」とエコーし、次にsubshel​​lに終了するように指示します(すでに存在しているはずですが、コマンド)。これを修正する最も簡単な方法は、おそらくifを使用することです:

if [[ `id -u` != 0 ]]; then
    echo "Must be root to run script"
    exit
fi
21
Michael Mrozek

bashの場合:

[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
2
Cyrus

||&&を囲む括弧は、右結合なので必要ありません。次の2つの式は同等です。

expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }

したがって、echoがtrueを返すため、&&ではなく;が正常に機能します。

[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
1
ata

これはbashであなたを助けるかもしれません

[Oracle@rac1 ~]$ which bash
/bin/bash
[Oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
 "
exit
fi
0