2015-05-08 10 views
5

Sto imparando bash e ho notato qualcosa di strano che non posso (ancora) spiegare. A scuola ho imparato che un'istruzione if valuta 0 come vero e 1 come falso, quindi può essere utilizzato con il codice di stato da un altro comando. Ora è la mia domanda: perché questo accade:Se affermazione con comportamento di confronto aritmetico in bash

echo $((5>2)) #prints 1 
echo $((5<2)) #prints 0 
if ((5>2)) ; then echo "yes" ; else echo "no" ; fi #prints yes 
if ((5<2)) ; then echo "yes" ; else echo "no" ; fi #prints no 

Questo non sembra logico. In che modo bash sa che sto usando un'espressione aritmetica e non un altro comando?

risposta

2

$((...)) è un'espressione aritmetica ; si espande al valore dell'espressione all'interno delle parentesi. Poiché non è un comando, non ha uno stato di uscita o un valore di ritorno. Un'espressione booleana restituisce 1 se è vera, 0 se è falsa.

((...)), d'altra parte, è una dichiarazione aritmetica . È un comando a sé stante, che funziona valutando il suo corpo come un'espressione aritmetica, quindi osservando il valore risultante. Se il valore è vero, il comando riesce e ha uno stato di uscita 0. Se il valore è falso, il comando non riesce , e ha uno stato di uscita pari a 1.

E 'una buona idea quando si impara bash smettere di pensare alle condizioni nelle istruzioni if, while, ecc. come vere o false, ma piuttosto se i comandi hanno esito positivo o negativo. Dopo tutto, i linguaggi di shell non sono progettati per l'elaborazione dei dati; sono un linguaggio di incollaggio per l'esecuzione di altri programmi.

+0

Hmm, sembra che abbia usato alcuni termini errati nella mia risposta. Spero che non ti dispiaccia modificare il mio modo di usare quelli corretti. –

7

Stai confondendo l'output della sostituzione di comando e il valore restituito del contesto aritmetico.

L'output della sostituzione di comando è 1 per true e 0 per false.

Il valore di ritorno di (()) è 0 (esito positivo) se il risultato è vero (cioè diverso da zero) e 1 se è falso.

if visualizza il valore di ritorno , non l'output del comando.

2

Dal manuale bash:

((expression))

L'espressione viene valutata secondo le regole descritte più avanti sotto VALUTAZIONE ARITMETICA. Se il valore dell'espressione è diverso da zero, lo stato di ritorno è 0; altrimenti lo stato di ritorno è 1. (Il corsivo è mio.)

Quindi, in sostanza in un contesto booleano ((expression)) dà l'inverso di ciò che $((expression)) darebbe.

Problemi correlati