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.
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".)
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
Avec bash:
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
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
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