it-swarm-eu.dev

Jak podmíněně něco udělat, pokud byl příkaz úspěšný nebo neúspěšný

Jak mohu udělat něco takového v bash?

if "`command` returns any error";
then
    echo "Returned an error"
else
    echo "Proceed..."
fi
337
Shinmaru

Jak podmíněně něco udělat, pokud byl příkaz úspěšný nebo neúspěšný

To je přesně to, co dělá bashův příkaz if:

if command ; then
    echo "Command succeeded"
else
    echo "Command failed"
fi

Přidávání informací z komentářů: vy nemusíte používat [ ... ] syntaxe v tomto případě. [ je sám o sobě příkazem, téměř ekvivalentem test. Je to pravděpodobně nejběžnější příkaz, který se používá v if, což může vést k předpokladu, že je to část syntaxe Shell. Pokud však chcete vyzkoušet, zda byl příkaz úspěšný nebo ne, použijte samotný příkaz přímo s if, jak je uvedeno výše.

413
Keith Thompson

Pro malé věci, které se chcete stát, pokud příkaz Shell funguje, můžete použít && konstruovat:

rm -rf somedir && trace_output "Removed the directory"

Podobně pro malé věci, které se mají stát, když se příkaz Shell nezdaří, můžete použít ||:

rm -rf somedir || exit_on_error "Failed to remove the directory"

Nebo oboje

rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"

Pravděpodobně není moudré s těmito konstrukcemi dělat moc, ale občas mohou mnohem lépe objasnit tok kontroly.

152
Bruce Ediger

Zkontrolujte hodnotu $?, který obsahuje výsledek provedení nejnovějšího příkazu/funkce:

#!/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
118
Ryan Stewart

To pro mě fungovalo:

command && echo "OK" || echo "NOK"

pokud command uspěje, pak echo "OK" je vykonán a protože je úspěšný, provádění se tam zastaví. V opačném případě, && je přeskočeno a echo "NOK" je provedeno.

52
German Rumm

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
6

Nejvíce náchylný k chybám, s nimiž bych mohl přijít, byl:

  • Nejprve získejte hodnotu. Předpokládejme, že uděláte něco jako:

RR=$?

Nyní, nejen pro tuto situaci, ale i pro ostatní, kterým můžete čelit, zvažte:

definovaná proměnná:

$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi

Odpověď: ano

$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi

Odpověď: ne

nedefinovaná proměnná:

$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi

Odpověď: ne

$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi

Odpověď: ano

$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi

Odpověď: ano

Tím se zabrání chybám všech druhů.

Pravděpodobně znáte veškerou syntaxi, ale zde je několik tipů:

  • Použijte uvozovky. Vyhněte se "blank", Abyste byli nothing.
  • Nový moderní zápis proměnných je ${variable}.
  • Přidáním nuly zřetězené před vaše číslo se také vyhnete „vůbec žádnému číslu“.
  • Počkejte, ale přidáním nuly se číslo stane base-8. Obdržíte chybu typu:
    • value too great for base (error token is "08") pro čísla nad 7. To je, když 10# Vstoupí do hry:
    • 10# Vynutí číslo base-10.
4
Dr Beco

Můžeš to udělat:

if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
  echo "ping response succsess!!!"
fi
1
Daniel
#!/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
1
Nick Vladiceanu

Jak je uvedeno jinde v tomto vlákně, původní otázka v podstatě odpovídá sama na sebe. Zde je ukázka, že podmínky if mohou být také vnořeny.

Tento příklad používá if ke kontrole, zda soubor existuje a zda se jedná o běžný soubor. Pokud jsou tyto podmínky pravdivé, zkontrolujte, zda má velikost větší než 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
1
quartzinquartz