Come posso fare qualcosa del genere in bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Come posso fare qualcosa del genere in bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Risposte:
Come fare in modo condizionale qualcosa se un comando ha esito positivo o negativo
Questo è esattamente ciò ifche fa l'affermazione di Bash :
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
Aggiunta di informazioni dai commenti: in questo caso non è necessario utilizzare la sintassi [... è esso stesso un comando, quasi equivalente a . È probabilmente il comando più comune da utilizzare in un , il che può portare a supporre che faccia parte della sintassi della shell. Ma se si desidera verificare se un comando ha avuto esito positivo o meno, utilizzare il comando stesso direttamente con , come mostrato sopra.][testifif
Modifica: cita la domanda in alto per maggiore chiarezza (questa risposta non viene visualizzata nella parte superiore della pagina).
thensu una linea separata.
if ! command ; then ... ; fi. [è esso stesso un comando e non è necessario in questo caso.
if [ ! command ]non esegue command; tratta commanduna stringa e la considera vera perché ha una lunghezza diversa da zero. [è sinonimo del testcomando
Per le piccole cose che vuoi che accadano se un comando di shell funziona, puoi usare il &&costrutto:
rm -rf somedir && trace_output "Removed the directory"
Allo stesso modo per le piccole cose che vuoi che accadano quando un comando di shell fallisce, puoi usare ||:
rm -rf somedir || exit_on_error "Failed to remove the directory"
O entrambi
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
Probabilmente non è saggio fare molto con questi costrutti, ma a volte possono rendere il flusso di controllo molto più chiaro.
Controllare il valore di $?, che contiene il risultato dell'esecuzione del comando / funzione più recente:
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
iflinguaggio di Bash . Preferisco la risposta di Keith Thompson.
ifè quello di farlo. Le condizioni di controllo del flusso in Bash tutte esaminano $?dietro le quinte; è quello che fanno. L'esame esplicito del suo valore dovrebbe essere superfluo nella stragrande maggioranza dei casi ed è generalmente un antipasto per principianti.
if ! cmdva bene. Altrimenti, un accordo comune è usare una elseclausola. Non puoi avere un vuoto, thenma a volte vedi then : nothing; elsedove il :no-op è significativo. truefunzionerebbe anche lì.
Questo ha funzionato per me:
command && echo "OK" || echo "NOK"
se commandriesce, echo "OK"viene eseguito e, poiché ha esito positivo, l'esecuzione si interrompe lì. Altrimenti, &&viene saltato ed echo "NOK"eseguito.
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))?
echo "OK"parte potrebbe fallire, allora è meglio:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Va notato che if...then...fie &&/ ||tipo di approccio riguarda lo stato di uscita restituito dal comando che vogliamo testare (0 in caso di successo); tuttavia, alcuni comandi non restituiscono uno stato di uscita diverso da zero se il comando non è riuscito o non è in grado di gestire l'input. Ciò significa che i soliti ife &&/ ||approcci non funzioneranno per quei comandi particolari.
Ad esempio, su Linux GNU fileesce ancora con 0 se ha ricevuto un file inesistente come argomento e findnon è riuscito a individuare il file specificato dall'utente.
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
In tali casi, un potenziale modo in cui potremmo gestire la situazione è la lettura stderr/ stdinmessaggi, ad esempio quelli restituiti dal filecomando o l'analisi dell'output del comando come in find. A tal fine, casepotrebbe essere utilizzata la dichiarazione.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
Il più soggetto a errori che ho potuto inventare era:
RR=$?
Ora, non solo per questa situazione, ma per altre persone che potresti incontrare, considera:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Risposta: si
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Risposta: no
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Risposta: no
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Risposta: si
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Risposta: si
Questo impedisce errori di ogni genere.
Probabilmente sei a conoscenza di tutta la sintassi, ma qui alcuni suggerimenti:
"blank"di essere nothing.${variable}.base-8. Verrà visualizzato un errore come:
value too great for base (error token is "08")per i numeri sopra 7. Questo è quando 10#entra in gioco:10#forza il numero per essere base-10.Puoi farlo:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
pingviene acquisito in vista della sua esecuzione come comando. Ma poiché l'output viene reindirizzato a / dev / null che sarà sempre la stringa vuota. Quindi non si esegue nulla in una subshell, il che significa che verrà mantenuto lo stato di uscita precedente (della subshell di sostituzione comando, ovvero ping). Ovviamente, il modo corretto è if ping ...; thenqui.
Come notato altrove in questo thread, la domanda originale sostanzialmente risponde a se stessa. Ecco un'illustrazione che mostra che anche le ifcondizioni possono essere nidificate.
Questo esempio ifconsente di verificare se esiste un file e se si tratta di un file normale. Se tali condizioni sono vere, controlla se ha dimensioni maggiori di 0.
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi
Questo potrebbe essere fatto semplicemente in questo modo poiché $?ti dà lo stato dell'ultimo comando eseguito.
Quindi potrebbe essere
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi