ユーザーがルートでない場合に終了するbashスクリプトを書いています。条件は正常に機能しますが、スクリプトは終了しません。
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
&&
ではなく;
を使用しようとしましたが、どちらも機能しません。
あなたはそれをこのようにすることができます:
[[ $(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
「サブシェル」の場合。)
これらのコマンドを囲む括弧は サブシェル を作成します。サブシェルは「スクリプトを実行するにはrootでなければならない」とエコーし、次にsubshellに終了するように指示します(すでに存在しているはずですが、コマンド)。これを修正する最も簡単な方法は、おそらくif
を使用することです:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
bashの場合:
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
||
と&&
を囲む括弧は、右結合なので必要ありません。次の2つの式は同等です。
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
したがって、echo
がtrueを返すため、&&
ではなく;
が正常に機能します。
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
これは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