2012-06-14 8 views
11

Qualcuno sa di un modo per eseguire più istruzioni all'interno di un test di bash? Quindi, se io uso:Un modo per eseguire più istruzioni per test di bash & una dichiarazione

[[ $Var = 1 ]] && echo "yes-1" || echo "no-1" 

e impostare Var=1 poi uscita è: yes-1
se ho impostato Var=2 poi uscita è: no-1

E questo lavoro come mi aspettavo. Ma se provo ad aggiungere un altro istruzione da eseguire nel mix e non funziona:

[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2" 

Il che ha senso come bash vede il comando termina a; ma ... questo non è quello che voglio.

Ho provato il raggruppamento, le valutazioni e le funzioni e ho avuto fallimenti e successi, ma mi piacerebbe davvero fare questo lavoro su una sola riga. Qualcuno ha qualche idea?

risposta

19

Il raggruppamento di comandi semplice dovrebbe funzionare; la sintassi può essere un po 'complicata però.

[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; } 

Un paio di cose da notare: consigli

  1. Heed @ di TVM sull'utilizzo di un if-then-else dichiarazione se si fa qualcosa di più complicato.

  2. Ogni comando all'interno delle parentesi deve essere terminato con un punto e virgola, anche l'ultimo.

  3. Ogni parentesi deve essere separata dal testo circostante da spazi su entrambi i lati. Le parentesi graffe non causano interruzioni di parole in bash, quindi "{echo" è una singola parola, "{echo" è una parentesi seguita dalla parola "echo".

+0

Grazie, ho provato qualcosa del genere ma devo aver perso ";" alla fine della seconda dichiarazione. –

+0

Ti ho dato la risposta corretta perché il ";" alla fine di ogni istruzione lo fa funzionare con o() sottoshell o {} raggruppamento. –

+0

IMO, il raggruppamento dei comandi è migliore, nella maggior parte dei casi. per esempio. se vuoi uscire da uno script quando qualcosa non funziona, puoi fare 'foocmd || {echo foo fallito; uscita 1; } 'e stamperà una diagnostica e uscirà. Se si usano le subshell per il raggruppamento, solo la subshell stessa uscirà, non la scipt, che non è quasi certamente l'effetto desiderato. – JVMATL

2

Utilizzare sottoshell:

$ Var=1; [[ $Var = 1 ]] && (echo "yes-1";echo "yes-2") || (echo "no-1";echo "no-2";) 
yes-1 
yes-2 

$ Var=2; [[ $Var = 1 ]] && (echo "yes-1";echo "yes-2") || (echo "no-1";echo "no-2";) 
no-1 
no-2 
+1

Sì, questo funziona e giuro che ho provato qualcosa di simile.Ho notato che non hai bisogno del ";" che hai dopo echo "no-2" per farlo funzionare, ma averlo non fa male e rende ovvio se si modifica il "()" per "{}", quindi è necessario il ";". –

+0

Ho sbattuto il tuo conto per farmi scendere il sentiero. Come dichiarato a "chepner" con ";" alla fine di ogni istruzione o() subshell o {} grouping funzionerà! –

+0

@ pn1dude d'accordo, io uso sempre ";" alla fine di tutti i miei comandi in una subshell o raggruppamento solo per coerenza ('" i casi speciali non sono abbastanza speciali da infrangere le regole "': P). L'unica ragione per cui non ho fatto questa volta è perché ero di fretta e ho copiato/incollato il tuo codice e semplicemente ho dimenticato: P Sono contento di averti aiutato, buona fortuna – KurzedMetal

10

considerare l'utilizzo regolare istruzione IF THEN ELSE. Uso di & & e || è giustificata in semplice test come questo:

[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!' 

Ma, in considerazione seguente comando:

true && true && true && false && true || echo 'False!' 
False! 

O

true && { echo true; false ; } || { echo false; true ; } 
true 
false 

Ogni volta che un non-zero stato di uscita viene restituito, comando dopo | | viene eseguito. Come puoi vedere, anche il comando di raggruppamento non aiuta.

Esecuzione in subshell si comporta in maniera simile:

true && (true; echo true; true; false) || (true; echo true; false) 
true 
true 

Proprio l'uso regolare SE, se avete bisogno di una corretta se il comportamento.

+0

Forse hai ragione ma il raggruppamento sembra funzionare. Generalmente uso il costrutto if-else-fi, ma mi piace la breve dolcezza di [[]] && || e su dichiarazioni facili e veloci a volte ne ho coinvolte 2 e l'if-else-fi occupa molto codice per un rapido e sporco [[]] && || con più dichiarazioni. –

Problemi correlati