Como faço para sair de um script em uma instrução condicional?

43

Eu estou escrevendo um script bash onde eu quero sair se o usuário não for root. O condicional funciona bem, mas o script não sai.

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

Eu tentei usar && em vez de ; , mas nem trabalho.

    
por Garrett Hall 04.11.2011 / 16:01

5 respostas

44

Você pode fazer isso desta maneira:

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

(expressão condicional "normal" com um operador binário aritmético na primeira declaração) ou:

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

(avaliação aritmética para o primeiro teste).

Observe a alteração () - > {} - as chaves não geram uma subcamada. (Pesquisa man bash para "subshell".)

    
por 04.11.2011 / 16:18
20

Os parênteses em torno desses comandos criam uma subshell . Seu subshell echos "Deve ser root para rodar script" e então você diz para o subshell para sair (embora já tivesse, já que não havia mais comandos). A maneira mais fácil de corrigir isso é provavelmente usar apenas um if :

if [[ 'id -u' != 0 ]]; then
    echo "Must be root to run script"
    exit
fi
    
por 04.11.2011 / 16:12
2

Com bash :

[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
    
por 13.07.2014 / 05:24
1

Os colchetes em torno de || e && não são obrigatórios, pois são associados à direita. As duas expressões a seguir são equivalentes:

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

Portanto, && em vez de ; funcionaria muito bem, pois echo retornará verdadeiro.

[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
    
por 05.11.2011 / 21:20
-1

isso pode ajudá-lo, no 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
    
por 15.11.2016 / 10:44