Kurzusok
/
Bash
Bash
/
Tanterv
/
Elágazások
El

Elágazások ebben a kurzusban: Bash

{one: "1 feladat", other: "%{count} feladat"}

A(z) Elágazások fogalomról

Mi számít igaznak Bashben?

A Bash nem ismeri a Boolean fogalmát. Csak stringek és számok vannak, valamint stringekből vagy számokból álló tömbök. Szóval hogyan bánnak a feltételes parancsok az igazzal és a hamissal?

Kilépési állapot

A parancsok befejeződésükkor egy kilépési állapotot adnak. A kilépési állapot egy 0 és 255 közötti egész szám (a határokat is beleértve). A Bash számára a nulla kilépési állapot a sikert jelenti. Bármely más kilépési állapot a sikertelenséget jelenti.

Ez minden parancsra igaz, beleértve a bash beépített parancsait, kulcsszavait és függvényeit.

Az „if” parancs

Az if parancs alapvető szintaxisa:

if CONDITIONAL_COMMANDS; then TRUE_COMMANDS; else FALSE_COMMANDS; fi

if-fel kezdődik; a feltételparancsokat a then választja el a „siker” parancsoktól; és fi-vel zárul. Az else ág elhagyható.

A CONDITIONAL_COMMANDS lehet egyetlen parancs, vagy lehet parancsok listája.

A CONDITIONAL_COMMANDS végrehajtódik, és

  • ha a kilépési állapot nulla (siker), akkor a TRUE_COMMANDS hajtódik végre.
  • ha a kilépési állapot nem nulla (sikertelenség), akkor a FALSE_COMMANDS hajtódik végre, feltéve hogy meg van adva.

Több egymást követő elágazást az elif-fel adhatsz meg:

if CONDITIONAL_COMMANDS
then TRUE_COMMANDS
elif CONDITIONAL_COMMANDS_2
then TRUE_COMMANDS_2
# more elif branches ...
else FALSE_COMMANDS
fi

A then, elif, else és fi szavak előtt pontosvesszőnek vagy sortörésnek kell állnia.

Hangsúlyozzuk: a vezérlést a feltételes parancsok kilépési állapota irányítja. Például a grep 0-t ad vissza, ha talál egyezést, és 1-et, ha nem talál. A -q kapcsoló elnyomja a kimenetet, így csak a kilépési állapot marad.

if grep -q "my pattern" my_file; then echo "the pattern is found in the file"; fi

A „[” és a „test” parancsok

A CONDITIONAL_COMMANDS körül nincs semmilyen különleges szintaxis. Lehet, hogy megszoktad, hogy az elágazások így néznek ki:

if [ "$password" = "secure" ]; then
    echo "Welcome!"
fi

A [ nem különleges szintaxis. Ez egy parancs, amely kiértékeli a feltételes kifejezést, és siker/sikertelenség állapottal lép ki. Mint minden parancsnál, itt is kötelező a szóköz közte és az argumentumai között.

A [ valójában a test parancs szinonimája. Pontosan ugyanaz a kettő, azzal a kivétellel, hogy a [ utolsó argumentumának mindig ]-nek kell lennie.

Feltételes kifejezések

A [ és ] között feltételes kifejezést írsz. Néhány tipikus feltételes kifejezés:

[ -f "$filename" ]             # file operations
[ "$string1" = "$string2" ]    # string comparisons
[ "$num1" -eq "$num2" ]        # arithmetic comparisons

Sok más művelet is elérhető; ezeket a kézikönyv Bash feltételes kifejezések szakasza sorolja fel.

Note

A fenti példákban figyeld meg, hogy minden változó idézőjelben van. A test és a [ parancs egyszerű parancs, ahol az argumentumok ugyanúgy szófelbontásnak és fájlnév-kiterjesztésnek vannak kitéve, mint bármely más parancsnál.

Ezt azért fontos megemlíteni, mert a feltételes kifejezések kiértékelése attól függ, hogy hány argumentumot adsz meg:

  • 0 argumentum: a kilépési állapot nem nulla (sikertelenség)
  • 1 argumentum: a kilépési állapot nulla (siker), ha az argumentum nem üres, és nem nulla, ha üres.
  • 2 argumentum: az első argumentumnak egy unáris operátornak kell lennie (például [ -z "$name" ]), vagy egy ! (ami megfordítja az 1 argumentumos teszt állapotát)
  • és még több.

Váratlan eredményeket kaphatsz, ha elfelejtesz idézőjelet használni:

str=""

# this prints "empty"
if [ -n "$str" ]; then echo "not empty"; else echo "empty"; fi

# leaving the variable unquoted results in incorrect "not empty" output
if [ -n $str ]; then echo "not empty"; else echo "empty"; fi

A „[[” kulcsszó

A [[...]] feltételes szerkezet nem parancs, hanem kulcsszó. Ez azt jelenti, hogy bár ugyanúgy kezelik, mint bármely más parancsot, különleges feldolgozási szabályai vannak. A [[ abban különleges, hogy a benne kifejtett változókra nem vonatkozik a szófelbontás és a fájlnév-kiterjesztés. Ez azt jelenti, hogy ez a parancs idézőjelek nélkül is úgy viselkedik, ahogy várnád.

if [[ -n $str ]]; then echo "not empty"; else echo "empty"; fi

A [[ minden olyan feltételes kifejezést támogat, amit a test és a [ is kezel. Ezen kívül a [[ a következőket nyújtja:

  • a =~ reguláris kifejezés illesztő operátort,
  • a == és a != glob-minta illesztő operátorként működik,
  • a && és a || logikai operátorként (különleges feldolgozási szabály),
  • a < és a > „csupasz” string-összehasonlító operátorként (különleges feldolgozási szabály: mivel ezek átirányítási szimbólumok, a [-ben escape-elni kell őket).

Széles körben elfogadott, hogy ezek a különleges lehetőségek annyi előnnyel járnak, hogy a [[-t érdemes kizárólagosan használni. (Például a Google Shell Style Guide.)

A „case” parancs

A case egy másik vezérlési szerkezet. Olyan, mint a „switch” utasítás más nyelvekben.

case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

A WORD-et minden PATTERN-hez illeszti. Amikor valamelyik illeszkedik, a COMMANDS végrehajtódik.

read -p "Guess the secret word: " word
case "$word" in
    secret) echo "Yes, you guessed it!" ;;
    ??????) echo "That's the right number of letters." ;;
    s*)     echo "You guessed the first letter." ;;
    *)      echo "Not even close! Try again." ;;
esac

Minden COMMANDS ágnak két pontosvesszővel, ;;-vel kell zárulnia.

Note
  1. Vannak olyan alternatívák, amelyek lehetővé teszik a parancsok átesését a következő ágra, és a mintailesztés folytatását. A részletekért nézd meg a kézikönyvet.
  2. Emlékezz rá, hogy a mintákról az Idézőjelek fogalom fájlnév-kiterjesztés szakaszában beszéltünk.
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg