回答:
これは次の方法で行うことができます。
[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }
(最初のステートメントに算術二項演算子を使用した「通常の」条件式)、または:
(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }
(最初のテストの算術評価)。
変更に注意してください()
-> {}
-中括弧はサブシェルを生成しません。(man bash
「サブシェル」を検索します。)
[[
数値比較には使用しないでください((
。
[[
は、の-eq
代わりに使用する限り問題ありません==
。
(( EUID )) && ...
これらのコマンドを囲む括弧はサブシェルを作成します。サブシェルは「スクリプトを実行するためにルートである必要があります」とエコーし、サブシェルに終了するように指示します(ただし、コマンドはもうないので、既に終了しています)。それを修正する最も簡単な方法は、おそらく単に使用することif
です:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
id -u == 0
、これはあなたが root であることを意味します。あなたが欲しい[[ $(id -u) != 0 ]]; then
。
[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
する$UID
にも注意してください。あなたも好むかもしれません$EUID
。
((UID)) && echo 'You have to be root.' && exit 1
。
set -e
中断することに注意してください。その問題の解決策の1つです[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
。
bash:
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
echo
ん(たとえば、stdoutが書き込み可能でないため)。
周りのブラケット||
及び&&
これらとして必要とされていないが右結合されています。次の2つの式は同等です。
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
そのため、trueを返すように、&&
代わりに;
うまく動作しecho
ます。
[[ $(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
exit 1
問題が発生した親プロセスを理解するため。