it-swarm.com.de

Wie beende ich ein Skript in einer bedingten Anweisung?

Ich schreibe ein Bash-Skript, in dem ich beenden möchte, wenn der Benutzer nicht root ist. Die Bedingung funktioniert einwandfrei, aber das Skript wird nicht beendet.

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

Ich habe versucht, && Anstatt von ; aber keine Arbeit.

52
Garrett Hall

Sie könnten das so machen:

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

("gewöhnlicher" bedingter Ausdruck mit einem arithmetischen Binäroperator in der ersten Anweisung) oder:

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

(arithmetische Auswertung für den ersten Test).

Beachten Sie die Änderung () -> {} - die geschweiften Klammern erzeugen nicht eine Unterschale. (Suche man bash für "Unterschale".)

53
Mat

Die Klammern um diese Befehle erzeugen eine nterschale . Ihre Subshell hallt "Muss root sein, um ein Skript auszuführen" und dann weisen Sie die Subshell an, zu beenden (obwohl dies bereits geschehen wäre, da es keine weiteren gab Befehle). Der einfachste Weg, dies zu beheben, ist wahrscheinlich die Verwendung eines if:

if [[ `id -u` != 0 ]]; then
    echo "Must be root to run script"
    exit
fi
21
Michael Mrozek

Mit bash:

[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
2
Cyrus

Klammern um || und && sind nicht erforderlich, da diese rechtsassoziativ sind. Die folgenden zwei Ausdrücke sind äquivalent:

expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }

Damit && Anstatt von ; würde gut funktionieren, da echo true zurückgibt.

[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
1
ata

dies könnte Ihnen helfen, in 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
0