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ò if
che 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.]
[
test
if
if
Modifica: cita la domanda in alto per maggiore chiarezza (questa risposta non viene visualizzata nella parte superiore della pagina).
then
su una linea separata.
if ! command ; then ... ; fi
. [
è esso stesso un comando e non è necessario in questo caso.
if [ ! command ]
non esegue command
; tratta command
una stringa e la considera vera perché ha una lunghezza diversa da zero. [
è sinonimo del test
comando
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
if
linguaggio 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 ! cmd
va bene. Altrimenti, un accordo comune è usare una else
clausola. Non puoi avere un vuoto, then
ma a volte vedi then : nothing; else
dove il :
no-op è significativo. true
funzionerebbe anche lì.
Questo ha funzionato per me:
command && echo "OK" || echo "NOK"
se command
riesce, 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...fi
e &&
/ ||
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 if
e &&
/ ||
approcci non funzioneranno per quei comandi particolari.
Ad esempio, su Linux GNU file
esce ancora con 0 se ha ricevuto un file inesistente come argomento e find
non è 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
/ stdin
messaggi, ad esempio quelli restituiti dal file
comando o l'analisi dell'output del comando come in find
. A tal fine, case
potrebbe 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
ping
viene 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 ...; then
qui.
Come notato altrove in questo thread, la domanda originale sostanzialmente risponde a se stessa. Ecco un'illustrazione che mostra che anche le if
condizioni possono essere nidificate.
Questo esempio if
consente 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