Answers:
您可以这样进行:
[[ $(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
“ subshell”。)
[[
进行数字比较,请使用((
。
[[
只要您使用-eq
而不是,@ChrisDown 都可以==
。
(( EUID )) && ...
这些命令的括号创建一个subshell。您的子shell回显“必须是root用户才能运行脚本”,然后您告诉该子shell退出(尽管已经这样做了,因为没有更多命令了)。解决该问题的最简单方法可能是使用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
中止。解决该问题的一种方法是[ "$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不可写),那将无法退出。
不需要括号||
,&&
因为它们是右关联的。以下两个表达式是等效的:
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
因此&&
,;
如果echo
返回true ,则不是可以正常工作。
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
这可能会对您有所帮助
[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
为了使父进程了解发生了问题。