it-swarm.dev

Jak zkontrolovat, zda byl příkaz úspěšný?

Existuje nějaký způsob, jak zkontrolovat, zda při provádění příkazu došlo k chybě?

Příklad:

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
}

Už jsem to zkusil, ale zdá se, že to nefunguje. Ne, jak na to.

264
moata_u

Návratová hodnota je uložena v $?. 0 označuje úspěch, ostatní označují chybu.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Jako každá jiná textová hodnota, můžete ji uložit do proměnné pro budoucí srovnání:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Možné operátory porovnání viz man test .

385
Lekensteyn

Pokud potřebujete pouze vědět, zda byl příkaz úspěšný nebo neúspěšný, neobtěžujte testování $?, jednoduše otestujte příkaz přímo. Např.:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

A přiřazení výstupu k proměnné nezmění návratovou hodnotu (dobře, pokud se nebude chovat jinak, když stdout samozřejmě není terminál).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals vysvětluje podrobněji if.

93
geirha
command && echo OK || echo Failed
32
Abraham Sanchez

$? by měl obsahovat stav ukončení předchozího příkazu, který by měl být nulový pro žádnou chybu.

Takže něco jako;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

pro většinu případů je jednodušší použít konstrukci && k řetězení příkazů, které musí vzájemně záviset. Tak cd /nonexistant && echo success! by ne echo úspěch, protože příkaz přeruší před &&. Důsledkem toho je ||, kde cd /nonexistant || echo failby echo selhalo, protože selhalo cd. (to se stane užitečným, pokud použijete něco jako || exit, který ukončí skript, pokud předchozí příkaz selhal.)

19
Shaun
command && echo $? || echo $?
5
modrobert

Je třeba poznamenat, že typ přístupu if...then...fi A &&/|| Se zabývá stavem ukončení vráceným příkazem, který chceme testovat (0 při úspěchu); Některé příkazy však nevrací nenulový stav ukončení, pokud příkaz selhal nebo se nemohl zabývat vstupem. To znamená, že obvyklé přístupy if a &&/|| Nebudou pro tyto konkrétní příkazy fungovat.

Například v systému Linux GNU file stále existuje 0, pokud jako argument obdržel neexistující soubor a find nemohl najít zadaného uživatele souboru .

$ 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

V takových případech je jedním z možných způsobů řešení situace čtení zpráv stderr/stdin, např. ty, které se vrátily příkazem file nebo analyzovaly výstup příkazu jako v find. Za tímto účelem lze použít příkaz case.

$ 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

(Toto je repost mé vlastní odpovědi na související otázka na unix.stackexchange.com )

5

Jak je uvedeno v mnoha dalších odpovědích, jednoduchý test $? to udělá, takto

if [ $? -eq 0 ]; then something; fi

Pokud chcete vyzkoušet, zda příkaz selhal, můžete použít kratší verzi v bash (ale možná přílišnou) takto:

if (($?)); then something; fi

Funguje to pomocí (( )) aritmetický režim, takže pokud se příkaz vrátil success, tj. $? = 0 pak test vyhodnotí na ((0)) které testuje jako false, jinak se vrátí true.

Chcete-li vyzkoušet úspěch, můžete použít:

if ! (($?)); then something; fi

ale už to není o nic méně než první příklad.

2
Reinstate Monica

Pro ověření chyb vaše příkazy:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

Inspirováno ve štíhlé výrobě:

1