web-dev-qa-db-fra.com

Comment quitter un script dans une instruction conditionnelle?

J'écris un script bash où je veux quitter si l'utilisateur n'est pas root. Le conditionnel fonctionne bien, mais le script ne se ferme pas.

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

J'ai essayé d'utiliser && au lieu de ; mais ni travail.

52
Garrett Hall

Vous pouvez le faire de cette façon:

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

(expression conditionnelle "ordinaire" avec un opérateur binaire arithmétique dans la première instruction), ou:

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

(évaluation arithmétique pour le premier test).

Remarquez le changement () -> {} - les accolades font pas engendrer un sous-shell. (Chercher man bash pour "subshell".)

53
Mat

Les parenthèses autour de ces commandes créent un sous-shell . Votre échos de sous-shell "Doit être root pour exécuter le script", puis vous dites au sous-shell de quitter (bien qu'il l'aurait déjà fait, car il n'y en avait plus commandes). La façon la plus simple de le résoudre est probablement d'utiliser simplement un if:

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

Avec bash:

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

Supports autour de || et && ne sont pas requis car ils sont associatifs à droite. Les deux expressions suivantes sont équivalentes:

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

Donc && au lieu de ; fonctionnerait très bien, car echo retournera true.

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

cela pourrait vous aider, en 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
0
sandeep kazipeta