Există vreo modalitate de a verifica dacă există o eroare în executare o comanda?
Exemplu :
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
Am încercat deja fac asta, dar se pare că nu e't de lucru. Eu nu't cum să fac asta.
Valoarea returnată este memorată în $?
. 0 indică succes, alții indică o eroare.
some_command
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
Ca orice altă valoare textual, puteți stoca într-o variabilă pentru viitor comparație:
some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
echo "Return code was not zero but $retval"
fi
Pentru posibile operatori de comparație, a se vedea om test
.
Dacă aveți nevoie doar să știu dacă comanda a reușit sau nu a reușit, don't deranjat de testare $?
, doar testul comanda direct. E. g.:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
Și atribuirea de ieșire la o variabilă nu't schimba valoarea de returnare (bine, cu excepția cazului în care se comportă în mod diferit atunci când stdout e't un terminal desigur).
if output=$(some_command); then
printf 'some_command succeded, the output was «%s»\n' "$output"
fi
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals explică "dacă" mai în detaliu.
command && echo OK || echo Failed
$? ar trebui să conțină starea de iesire de comanda de mai sus, care ar trebui să fie zero pentru nici o eroare.
Deci, ceva de genul;
cd /nonexistant
if [ $? -ne 0 ]
then
echo failed
else
echo success!
fi
pentru cele mai multe cazuri,'s ușor de utilizat && pentru a construi lanțul de comenzi pe care trebuie să depindem unul de altul. Deci cd /inexistenta && echo succes!
ar nu echo succes pentru comanda pauze înainte &&. Corolarul acestui fapt este ||, unde cd /inexistenta || echo eșua` ar echo eșua, pentru cd nu a reușit. (acest lucru devine util dacă utilizați ceva de genul ||ieșire, care se va încheia scenariul, dacă comanda anterioară nu a reușit.)
Ar trebui remarcat faptul că dacă...atunci...fi " și " &&
/||
tip de abordare oferte cu ieșire starea returnată de comanda vrem să testăm( 0 la succes ); cu toate acestea, unele comenzi nu't se întoarcă un non-zero exit status dacă comanda nu a reușit sau n-a't se ocupe de intrare. Acest lucru înseamnă că de obicei dacă " și " &&/
||` se apropie câștigat't de lucru pentru acele comenzi.
De exemplu, pe Linux GNU "dosar" încă ieșirile cu 0 dacă a primit un non-existente fișier ca argument și "găsi" n't localizați fișierul specificat de utilizator.
$ 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
În astfel de cazuri, o modalitate potențială am putea face față situației este prin citirea stderr
/standard
de mesaje, de exemplu, cei care au revenit de "dosar" de comandă, sau analiza de ieșire de comandă ca în "găsi". Pentru că sensul, " caz " declarație ar putea fi folosit.
$ 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
( Acesta este un repost de propriul meu răspuns pe întrebare legate la unix.stackexchange.com )
După cum sa menționat în multe alte răspunsuri, un test simplu de $?
va face, ca aceasta
if [ $? -eq 0 ]; then something; fi
Dacă doriți să testați dacă comanda eșuat, puteți utiliza o versiune mai scurtă în bash
(dar, probabil, nejustificată), după cum urmează:
if (($?)); then something; fi
Aceasta funcționează prin utilizarea (( ))
aritmetică, modul, astfel încât în cazul în care comanda a revenit "succes", adică $? = 0 atunci testul se evaluează la
((0))` care teste ca "false", în caz contrar acesta va returna "true".
Pentru a testa pentru succes, ai putea folosi:
if ! (($?)); then something; fi
dar's deja nu mult mai scurt decât primul exemplu.
Pentru eroare de verificare comenzile:
execute [INVOKING-FUNCTION] [COMMAND]
execute () {
error=$($2 2>&1 >/dev/null)
if [ $? -ne 0 ]; then
echo "$1: $error"
exit 1
fi
}
Inspirat în Lean manufacturing: