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?
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 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
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 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.
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.
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:
[ -z "$name" ]), vagy egy ! (ami megfordítja az 1 argumentumos teszt állapotát)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 [[...]] 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:
=~ reguláris kifejezés illesztő operátort,== és a != glob-minta illesztő operátorként működik,&& és a || logikai operátorként (különleges feldolgozási szabály),< é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 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.