Píšu bash skript, kde chci ukončit, pokud uživatel není root. Podmíněné funguje dobře, ale skript není ukončen.
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
Zkusil jsem použít &&
namísto ;
ale ani nefungují.
Dalo by se to takto:
[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }
(„obyčejný“ podmíněný výraz s aritmetickým binárním operátorem v prvním příkazu) nebo:
(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }
(aritmetické hodnocení pro první test).
Všimněte si změny ()
-> {}
- složené závorky ne vytvářejí subshell. (Vyhledávání man bash
pro "subshell".)
Závorky kolem těchto příkazů vytvoří subshell . Váš subshell echos "Musí být root, aby se skript spouštěl" a pak řeknete subshell , aby ukončil (i když by to už bylo, protože už neexistovaly žádné další příkazy). Nejjednodušší způsob, jak to opravit, je pravděpodobně pouze použít if
:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
S bash:
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
Zátěžky kolem ||
a &&
nejsou vyžadovány, protože se jedná o asociativní právo. Následující dva výrazy jsou rovnocenné:
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
Tak &&
namísto ;
by fungovalo dobře, protože echo
se vrátí true.
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
to by vám mohlo pomoci, v bash
[[email protected] ~]$ which bash
/bin/bash
[[email protected] ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
"
exit
fi