2014-07-11 3 views
33

Sembra essere una domanda facile, mi chiedo perché Google non abbia dato nulla di utile - né in StackOverflow, né in tutorial. Devo solo controllare usando bash che una condizione è falsa.Verifica se una condizione è falsa

Di quello che ho trovato ho provato

if ! [ 0==2 ]; then echo Hello; fi 

e

if [ ! 0==2 ]; then echo Hello; fi 

nessuno di loro stampare Ciao.

Ho trovato solo due domande simili, ma la risposta finale in entrambi i casi è stato il codice ristrutturato per non utilizzare la condizione "falso".

+0

vi consiglio di leggere il [pagina di manuale] (http://man7.org/linux/man-pages/man1/test.1.html). –

+1

'[0! = 2] && echo" ciao "' lo rende. – fedorqui

+0

@JoachimPileborg il 'test' è un comando completamente separato. Qual è la differenza tra 'test' e' if', tale, che dovrei usare il 'test' invece? –

risposta

57

vuoi dire:

if ! [ 0 == 2 ]; then 
    echo Hello; 
fi 

È mancava spazio intorno l'operatore di uguaglianza.

Questo potrebbe essere il momento di leggere http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html - in particolare le sezioni su se poi altro e gli operatori. Di solito ho questo aperto quando sto scrivendo script ..

+0

Sì, funziona! Per favore, puoi aggiungere una piccola spiegazione alla risposta, perché il '!' Nel mio caso non ha funzionato? Cioè questo comando 'if [0 == 0]; quindi echo Ciao; va bene, quindi qual'è il motivo? –

+0

Sì ... Hai ragione, il problema era lo spazio ... Hm ... Ma perché allora il 'if [0 == 0]; quindi echo Ciao; ha funzionato? –

+2

Questa è la sintassi della shell legacy ed è fragile per quanto riguarda gli spazi bianchi. Nessun motivo per usare al giorno d'oggi. –

3

Oltre alle valutazioni matematiche di bash, è possibile utilizzare le espressioni booleane, invece di if:

[[email protected]:~] $ ((0 == 0)) && echo True || echo False 
True 
[[email protected]:~] $ ((0 != 0)) && echo True || echo False 
False 
4

Se si utilizza il comando test ([..]) puoi usare l'opzione di confronto per intero: -eq, uguale, e -ne, non uguale.

if [ 0 -eq 2 ]; then echo true ; else echo false ; fi # false 
if [ 0 -eq 0 ]; then echo true ; else echo false ; fi # true 

if [ 0 -ne 2 ]; then echo true ; else echo false ; fi # true 
if [ 0 -ne 0 ]; then echo true ; else echo false ; fi # false 

In bash l'operatore [...] è l'equivalente di test, un comando che controlla i tipi di file e confrontare i valori; test è un comando interno: se chiedi alla tua shell con type [ risponderà allo [ is a built in shell command. Puoi trovare il binario anche di solito in .

Il SYNOPSIS è test EXPRESSION, come si può leggere da man test o da info coreutils test invocation.

Un'omessa ESPRESSIONE è impostata su false. Altrimenti, ESPRESSIONE è vera o falsa e imposta lo stato di uscita.

Questo è un estratto da uomo che il CAM di aiuto per capire un po 'meglio

  • (ESPRESSIONE) espressione è vera.Quindi è facile incorrere nell'errore da considerare come un'operazione 0==1. (L'operazione è 0 == 1 con spazi, 0==1 è un'espressione).

  • ! EXPRESSION EXPRESSION è falso.

  • ...
  • INTERO1 eq INTERO2 INTERO1 è uguale a INTERO2
  • INTERO1 -ne INTERO2 INTERO1 non è uguale a INTERO2

Da info coreutils test invocation si può leggere su l'uscita stato del test.

Exit status:

0 if the expression is true, 
1 if the expression is false, 
2 if an error occurred.