GNU/Linux >> Znalost Linux >  >> Linux

Bash Beginner Series #7:Rozhodování s If Else a případovými prohlášeními

Udělejme naše bash skripty inteligentní!

V této části bash série pro začátečníky se naučíte, jak používat podmíněné příkazy ve vašich bash skriptech, aby se chovaly odlišně v různých scénářích a případech.

Tímto způsobem můžete vytvářet mnohem efektivnější bash skripty a také můžete ve svých skriptech implementovat kontrolu chyb.

Použití příkazu if v bash

Nejzákladnějším konstruktem v jakékoli rozhodovací struktuře je podmínka if. Obecná syntaxe základního příkazu if je následující:

if [ condition ]; then
  your code
fi

if příkaz je uzavřen znakem fi (opak if).

Dávejte pozor na mezery!

  • Mezi otevírací a uzavírací závorkou a podmínkou, kterou zapisujete, musí být mezera. Jinak si shell bude stěžovat na chybu.
  • Před a za podmíněným operátorem (=, ==, <=atd.) musí být mezera. V opačném případě se zobrazí chyba jako „očekává se unární operátor“.

Nyní vytvoříme ukázkový skript root.sh. Tento skript bude opakovat prohlášení „jste root“ pouze v případě, že skript spustíte jako uživatel root:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
	echo "You are root"
fi

whoami příkaz vypíše uživatelské jméno. Z výukového programu proměnných bash víte, že $(command) syntaxe se používá pro substituci příkazů a poskytuje výstup příkazu.

Podmínka $(whoami) = 'root' bude true pouze v případě, že jste přihlášeni jako uživatel root.

nevěříš mi? Nemusíš. Spusťte to a uvidíte to sami.

Použití příkazu if-else v bash


Možná jste si všimli, že při spuštění root.sh nezískáte žádný výstup skript jako běžný uživatel. Jakýkoli kód, který chcete spustit, když je podmínka if vyhodnocena jako nepravda, lze zahrnout do příkazu else takto:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

Nyní, když spustíte skript jako běžný uživatel, bude vám připomenuto, že nejste všemohoucí uživatel root:

[email protected]:~$ ./root.sh
You are not root

Použití příkazu else if v bash

Příkaz elif (else-if) můžete použít, kdykoli chcete testovat více než jeden výraz (podmínku) současně.

Například následující age.sh bash skript vezme váš věk jako argument a vydá smysluplnou zprávu, která odpovídá vašemu věku:

#!/bin/bash

AGE=$1

if [ $AGE -lt 13 ]; then
	echo "You are a kid."
elif [ $AGE -lt 20 ]; then
	echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
	echo "You are an adult."
else
	echo "You are an elder."
fi

Nyní proveďte několik spuštění age.sh skript k otestování v různých věkových skupinách:

[email protected]:~$ ./age.sh 11
You are a kid.
[email protected]:~$ ./age.sh 18
You are a teenager.
[email protected]:~$ ./age.sh 44
You are an adult.
[email protected]:~$ ./age.sh 70
You are an elder.

Všimněte si, že jsem použil -lt (menší než) testovací podmínka s proměnnou $AGE.

Uvědomte si také, že můžete mít více elif příkazy, ale pouze jeden else příkaz v konstrukci if a musí být uzavřen pomocí fi .

Použití vnořených příkazů if v bash

Příkaz if můžete také použít v rámci jiného příkazu if. Podívejte se například na následující weather.sh bash skript:

#!/bin/bash

TEMP=$1

if [ $TEMP -gt 5 ]; then
	if [ $TEMP -lt 15 ]; then
		echo "The weather is cold."
	elif [ $TEMP -lt 25 ]; then
		echo "The weather is nice."
	else
		echo "The weather is hot."
	fi
else
	echo "It's freezing outside ..."
fi

Skript vezme libovolnou teplotu jako argument a poté zobrazí zprávu, která odráží, jaké by bylo počasí. Pokud je teplota vyšší než pět, vyhodnotí se vnořený (vnitřní) příkaz if-elif. Udělejme několik spuštění skriptu, abychom viděli, jak to funguje:

[email protected]:~$ ./weather.sh 0
It's freezing outside ...
[email protected]:~$ ./weather.sh 8
The weather is cold.
[email protected]:~$ ./weather.sh 16
The weather is nice.
[email protected]:~$ ./weather.sh 30
The weather is hot.

Použití příkazu Case v bash

Můžete také použít příkazy case v bash k nahrazení více příkazů if, protože jsou někdy matoucí a těžko čitelné. Obecná syntaxe konstrukce typu case je následující:

case "variable" in
	"pattern1" )
		Command … ;;
	"pattern2" )
		Command … ;;
	"pattern2" )
		Command … ;;
esac

Dávejte pozor!

  • Za vzory vždy následuje mezera a ) .
  • Za příkazy vždy následuje dvojitý středník ;; . Mezera před ním není povinná.
  • Příkazy případu končí esac (obrácený případ).

Příkazy typu case jsou zvláště užitečné při práci s porovnáváním vzorů nebo regulárními výrazy. Chcete-li to demonstrovat, podívejte se na následující char.sh bash skript:

#!/bin/bash

CHAR=$1

case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac

Skript vezme jeden znak jako argument a zobrazí, zda je znakem malá/velká abeceda, číslo nebo speciální znak.

[email protected]:~$ ./char.sh a
Small Alphabet.
[email protected]:~$ ./char.sh Z
Big Alphabet.
[email protected]:~$ ./char.sh 7
Number.
[email protected]:~$ ./char.sh $
Special Character.

Všimněte si, že jsem použil zástupný symbol hvězdičky (*) k definování výchozího případu, který je ekvivalentem příkazu else v podmínce if.

Testovací podmínky v bash

Existuje mnoho testovacích podmínek, které můžete použít s příkazy if. Podmínky testu se liší, pokud pracujete s čísly, řetězci nebo soubory. Představte si je jako logické operátory v bash.

Do tabulky níže jsem zahrnul některé z nejoblíbenějších testovacích podmínek:

Podmínka Ekvivalentní
$a -lt $b $a <$b
$a -gt $b $a> $b
$a -le $b $a <=$b
$a -ge $b $a>=$b
$a -eq $b $a se rovná $b
$a -ne $b $a se nerovná $b
-e $FILE $FILE existuje
-d $FILE $FILE existuje a je to adresář.
-f $FILE $FILE existuje a je to běžný soubor.
-L $FILE $FILE existuje a je to měkký odkaz.
$STRING1 =$STRING2 $STRING1 se rovná $STRING2
$STRING1 !=STRING2$ $STRING1 se nerovná $STRING2
-z $ STRING1 $STRING1 je prázdný

Naštěstí si nemusíte pamatovat žádné z testovacích podmínek, protože je můžete vyhledat na testovací manuálové stránce:

[email protected]:~$ man test

Pojďme vytvořit jeden finální skript s názvem filetype.sh který zjišťuje, zda je soubor běžným souborem, adresářem nebo měkkým odkazem:

#!/bin/bash

if [ $# -ne 1 ]; then
	echo "Error: Invalid number of arguments"
 	exit 1
fi

file=$1

if [ -f $file ]; then
	echo "$file is a regular file."
elif [ -L $file ]; then
	echo "$file is a soft link."
elif [ -d $file ]; then
	echo "$file is a directory."
else
	echo "$file does not exist"
fi

Skript jsem trochu vylepšil přidáním kontroly počtu argumentů. Pokud neexistují žádné argumenty nebo více než jeden argument, skript vypíše zprávu a ukončí se bez spuštění zbývajících příkazů ve skriptu.

Udělejme několik spuštění skriptu, abychom jej otestovali s různými typy souborů:

[email protected]:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
[email protected]:~$ ./filetype.sh /bin
/bin is a soft link.
[email protected]:~$ ./filetype.sh /var
/var is a directory.
[email protected]:~$ ./filetype.sh 
Error: Invalid number of arguments

Bonus:Bash if else na jednom řádku

Doposud byly všechny příkazy if else, které jste viděli, použity ve správném bash skriptu. To je slušný způsob, jak to udělat, ale nejste k tomu povinni.

Pokud chcete vidět výsledek v samotném shellu, můžete použít příkaz if else na jednom řádku v bash.

Předpokládejme, že máte tento bash skript.

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

Můžete použít všechny příkazy if else na jednom řádku takto:

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

Výše uvedené můžete zkopírovat a vložit do terminálu a sami uvidíte výsledek.

V podstatě stačí přidat středníky za příkazy a poté přidat další příkaz if-else.

Úžasný! To by vám mělo poskytnout dobré porozumění podmíněným příkazům v Bash. Doufám, že jste si užili vylepšování bash skriptů!

Své nově naučené znalosti si můžete otestovat procvičováním jednoduchých bashových cvičení v PDF níže. Obsahuje také řešení.

Bash Kapitola 7 Cvičné otázkyProblémy a jejich řešení k procvičení toho, co jste se právě naučili v této kapitole Bash-Kapitola-7-Procvičení-otázek-Linux-Příručka.pdf31 KB

Zůstaňte naladěni na příští týden, protože se naučíte používat různé konstrukce smyček ve svých bash skriptech.


Linux
  1. Díky Linuxu budou počítače dostupnější a udržitelnější

  2. Bash Beginner Series #9:Použití funkcí v Bash

  3. Bash Beginner Series #8:Loops in Bash

  1. Jak programovat s Bash:Syntaxe a nástroje

  2. Procházení shellu Bash pomocí pushd a popd

  3. Linuxové distro jen s busyboxem a bashem?

  1. Bash case Syntaxe a příklady

  2. RHCE Ansible Series #6:Rozhodování v Ansible

  3. Použití případových prohlášení v Bash