2010-09-28 8 views
55

Ho definito la seguente variabile:Come valutare una variabile booleana in un blocco if in bash?

myVar=true 

ora mi piacerebbe correre qualcosa sulla falsariga di questo:

if [ myVar ] 
then 
    echo "true" 
else 
    echo "false" 
fi 

Il codice sopra funziona, ma se cerco di impostare

myVar=false 

verrà comunque visualizzato true. Quale potrebbe essere il problema?

Edit: so di poter fare qualcosa di forma

if [ "$myVar" = "true" ]; then ... 

ma è un pò imbarazzante.

Grazie

+0

Vedere anche: http://stackoverflow.com/questions/2953646/how-to-declare-and-use-boolean-variables-in-shell-script/21210966#21210966 –

risposta

93

bash non sa variabili booleane, né test (che è quello che viene chiamato quando si utilizza [).

Una soluzione sarebbe:

if $myVar ; then ... ; fi 

perché true e false sono comandi che restituiscono 0 o 1 rispettivamente che è ciò if aspetta.

Si noti che i valori sono "scambiati". Il comando dopo if deve restituire 0 in caso di successo mentre 0 significa "falso" nella maggior parte dei linguaggi di programmazione.

AVVISO DI SICUREZZA: Questo funziona perché BASH espande la variabile, quindi tenta di eseguire il risultato come comando! Assicurarsi che la variabile non può contenere codice maligno come rm -rf /

+0

+1 per picchiarmi al punch e con una buona spiegazione :-) –

+1

Potrebbe aggiungere non dimenticare il '; fi' alla fine. Quindi è "se $ myVar; poi ... ; fi' – IanBussieres

+5

e 'se! $ myVar; poi ... ; fi' fornisce l'inverso – Pancho

32

Si noti che il costrutto if $myVar; then ... ;fi ha un problema di sicurezza che si potrebbe voler evitare con

case $myvar in 
    (true) echo "is true";; 
    (false) echo "is false";; 
    (rm -rf*) echo "I just dodged a bullet";; 
esac 

Si potrebbe anche voler ripensare perché if [ "$myvar" = "true" ] appare imbarazzante per voi . È un confronto tra stringhe di shell che batte probabilmente un processo forking per ottenere uno stato di uscita. Una forcella è un'operazione pesante e costosa, mentre un confronto tra stringhe è a buon mercato. Pensa a un paio di cicli di CPU rispetto a diverse migliaia. La mia soluzione case viene gestita anche senza forche.

+1

'true' e' false' sono comandi incorporati nella maggior parte delle shell.È improbabile che invocarli richieda una chiamata a 'fork()'. –

Problemi correlati