Hogyan tehetek feltételesen valamit, ha egy parancs sikeres vagy sikertelen volt

Hogyan tehetek ilyet a bash-ban?

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

Válasz

Hogyan tehetünk feltételesen valamit, ha egy parancs sikeres vagy sikertelen volt

Pontosan ez az, amit bash A “s if utasítás ezt teszi:

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

Információk hozzáadása a megjegyzésekből: Ön nem” t ebben az esetben a [] szintaxist kell használni. [ maga a parancs, amely majdnem egyenértékű a test -vel. Valószínűleg a if -ben használatos parancs, amely arra a feltételezésre, hogy a héj szintaxisa. De ha tesztelni szeretné, hogy egy parancs sikeres volt-e vagy sem, akkor használja magát a parancsot közvetlenül a if paranccsal, a fentiek szerint.

Megjegyzések

  • Ne feledje, hogy a pontosvessző fontos.
  • Vagy egyszerűen beírhatja a then t egy külön sorba.
  • @Joe: Szerintem if ! command ; then ... ; fi -re gondolsz. A [ maga is egy parancs, és ‘ ebben az esetben nincs szükség.
  • @Joe: Saját utam erénye is a helyes. if [ ! command ] nem ‘ t hajt végre command; az command -t karakterláncként kezeli, és igaznak tekinti, mert nem nulla hosszúságú. A [ a test parancs szinonimája
  • Hoppá. ‘ helyes.

Válasz

Apróságokra hogy ha egy shell parancs működik, használhatja a && konstruktumot:

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

Hasonlóképpen olyan apró dolgok, amelyek történni szeretnének, ha egy shell parancs meghiúsul, használhatja a ||:

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

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

Valószínűleg nem okos nagyon sokat tenni ezekkel a konstrukciókkal, de alkalmanként sokkal tisztábbá tehetik a vezérlés áramlását.

Megjegyzések

  • Rövidebbek és (legalábbis néhány kagylóban) gyorsabbak. Megborzongok, amikor eszembe jutott egy Monster Ultrix telepítési szkript, amely csak ezekhez a feltételes konstrukciókhoz íródott, amelyeket egyszer megpróbáltam megfejteni …

Válasz

Ellenőrizze a $?, amely a legfrissebb parancs / függvény végrehajtásának eredményét tartalmazza:

#!/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 

Megjegyzések

  • Bár technikailag helytállóak (és így nem indokolják a visszhangot), ‘ s nem használja a Bash ‘ s if idiómát. Jobban szeretem Keith Thompson ‘ válaszát.
  • Ennek az idiómának vannak előnyei – megőrzi a visszatérési értéket. Összességében úgy vélem, hogy ez erőteljesebb, bár bőbeszédűbb. ez ‘ is könnyebben olvasható.
  • Mi az a ” Bash ‘ s if idiom “?
  • @Nowaker Az a tény, hogy a if egyetlen célja: ez. A Bash-ben lévő áramlásszabályozási feltételek a $? elemeket vizsgálják a kulisszák mögött; hogy ‘ amit csinálnak. Értékének kifejezett vizsgálatának az esetek túlnyomó többségében feleslegesnek kell lennie, és általában kezdő antipattern.
  • Ezt jobban szeretem az olvashatóság érdekében. A fő parancs általában nagyon hosszú. Ha egy ” utasításba helyezi, ha ” utasítás rosszul olvasható.

Válasz

Ez nekem bevált:

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

ha command sikeres, akkor a echo "OK" végrehajtásra kerül, és mivel ez sikeres, a végrehajtás ott leáll. Ellenkező esetben a && átugrik, és A echo "NOK" parancs végrehajtásra kerül.

Megjegyzések

  • Ha valamit meg akar tenni, ha ez nem sikerül, és őrizze meg a kilépési kódot (a parancssorban való megjelenítéshez vagy a szkript teszteléséhez) megteheti: command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
  • @ Sam-Hasler: shouldn ‘ t, amelyek command && echo "OK" || (c=$?; echo "NOK"; (exit $c))?
  • Továbbá, ha a echo "OK" rész maga is képes lenne nem sikerül, akkor ez jobb: command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
  • @ jrw32982, Nizza, I ‘ az előbbi konstrukciót használtam, de az utóbbit nem.
  • Az igazi válasz a megjegyzésekben található, köszönet mindenkinek!

Válasz

Meg kell jegyezni, hogy if...then...fi és && / || típusú megközelítés a kimenet állapotával foglalkozik, amelyet a tesztelni kívánt parancs ad vissza (0 siker esetén); egyes parancsok azonban nem adják meg a nullától eltérő kilépési állapotot, ha a parancs meghiúsult, vagy nem tudtak foglalkozni a bemenettel. Ez azt jelenti, hogy a szokásos if és && / || megközelítés nem fog működni azok számára adott parancsok.

Például Linuxon a GNU file továbbra is 0-val lép ki, ha nem létező fájlt kapott argumentumként, és find nem sikerült megtalálni a megadott fájlfelhasználót.

$ 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 

Ilyen esetekben a helyzet kezelésének egyik lehetséges módja a stderr / stdin üzenetek, pl. azok, amelyek file paranccsal tértek vissza, vagy a parancs kimenetét elemezték, mint például a find. Erre a célra a case utasítás használható.

$ 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 

Válasz

A legtöbb hibára hajlamos voltam előállni:

  • Először kapja meg az értéket. Tegyük fel, hogy valami olyasmit csinál, mint:

RR=$?

Most, nem csak ezért a helyzetért, hanem másokért is, fontolja meg:

meghatározott változó:

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

Válasz: igen

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

Válasz: nem

undefined változó:

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

Válasz: nem

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

Válasz: igen

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

Válasz: igen

Ez megakadályozza az összes hibát.

Valószínűleg tisztában van az összes szintaxissal, de itt néhány tippek:

  • Használjon idézőjeleket. Kerülje el, hogy egy "blank" nothing legyen.
  • A változók új modern jelölése ${variable}.
  • A szám elé összefűzött nulla hozzáadásával elkerülhető a “semmilyen szám”.
  • De várjon, ha egy nulla hozzáadásával a szám base-8. Ilyen hibát kap:
    • value too great for base (error token is "08") a 7 feletti számoknál. Ekkor kerül szóba az 10#:
    • 10# a számot .

Válasz

Ezt megteheti:

if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then echo "ping response succsess!!!" fi 

Megjegyzések

  • Ez működik, de összezavarodott. ‘ pinget futtat egy alhéj alhéjában, az ping kimenete rögzítésre kerül annak érdekében, hogy parancsként fusson. De mivel a kimenetet a / dev / null helyre irányítják, ez mindig az üres karakterlánc lesz. Tehát ‘ semmit sem futtat alhéjban, ami azt jelenti, hogy az előző (a parancs-helyettesítő alhéj, vagyis a ping) kilépési állapota megmarad. Nyilvánvaló, hogy a helyes mód itt if ping ...; then található.

Válasz

Ahogyan e szál másutt megjegyezte, az eredeti kérdés alapvetően önmagára ad választ. Itt egy illusztráció, amely bemutatja, hogy a if feltételek is beágyazódhatnak.

Ez a példa a if használatával ellenőrzi, hogy létezik-e fájl, és hogy ez rendes fájl-e. Ha ezek a feltételek teljesülnek, ellenőrizze, hogy mérete nagyobb-e, mint 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 

Megjegyzések

  • A válaszod ezt teszi, de a válasz nem foglalkozik a kérdéssel.
  • @JeffSchaller, köszönöm a jegyzetet. Szerkesztettem a bejegyzésemet, hogy tartalmazzon hivatkozást a kérdésre.

Válasz

#!/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 

megjegyzések

Válasz

Ezt egyszerűen így lehet megtenni, mivel a $? megadja az állapotot a legutóbb végrehajtott parancsokból.

Így lehet

#!/bin/sh ... some command ... if [ $? == 0 ] ; then echo "<the output message you want to display>" else echo "<failure message>" fi 

Megjegyzések

  • Downvote: Ez egyszerűen átfogalmaz egy korábbi választ, amely jogosan kapott kritikát az unidiomatikusság miatt.
  • Valójában pontosan ezt kerestem, mert ‘ próbálkoztam hogy a ” parancs ” meghiúsítsa a szkriptet a ” set -e ” amelyet nem ‘ t, ha azEzt nem szabad ‘ alul szavazni.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük