如何在条件语句中退出脚本?

Gar*_*all 57 shell scripting bash shell-script

我正在编写一个 bash 脚本,如果用户不是 root,我想在其中退出。条件工作正常,但脚本不退出。

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

我试过使用&&而不是,;但都不起作用。

Mat*_*Mat 64

你可以这样做:

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

(在第一条语句中带有算术二元运算符的“普通”条件表达式),或:

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

(第一次测试的算术评估)。

请注意更改()-> {}- 大括号不会产生子外壳。(搜索man bash“子外壳”。)

  • @ChrisDown `[[` 就可以了,只要你使用 `-eq` 而不是 `==`。 (2认同)
  • @Mat 顺便说一句,您可以将其缩短为`(( EUID )) && ...` (2认同)

Mic*_*zek 23

这些命令周围的括号创建一个子shell。您的子shell 回显“必须是root 才能运行脚本”,然后您告诉子shell退出(尽管它已经退出了,因为没有更多命令)。修复它的最简单方法可能是使用一个if

if [[ `id -u` != 0 ]]; then
    echo "Must be root to run script"
    exit
fi
Run Code Online (Sandbox Code Playgroud)

  • 如果你/必须/有一个单行,试试这个大小:`[ "$UID" != 0 ] && echo 'You must be root.' && exit 1;` 还要注意 `$UID`,它可以节省生成进程。我想你甚至可能更喜欢`$EUID`。 (4认同)
  • @janmoesen:请注意,使用这种逆向逻辑会导致脚本“set -e”中止。该问题的一种解决方案是`[ "$UID" != 0 ] && echo 'You must be root.' && 退出 1 || 真的`。 (3认同)