
V tomto tutoriálu probereme základy select
konstruovat v Bash.
select
konstrukt umožňuje generovat nabídky.
Bash select
Konstrukce #
select
konstrukt generuje nabídku ze seznamu položek. Má téměř stejnou syntaxi jako for
smyčka:
select ITEM in [LIST]
do
[COMMANDS]
done
[LIST]
může být řada řetězců oddělených mezerami, rozsah čísel, výstup příkazu, pole a tak dále. Vlastní výzva pro select
konstrukt lze nastavit pomocí PS3
proměnná prostředí.
Když select
je vyvolána konstrukce, každá položka ze seznamu se vytiskne na obrazovku (standardní chyba), před kterou je uvedeno číslo.
Pokud uživatel zadá číslo, které odpovídá číslu jedné ze zobrazených položek, pak hodnota [ITEM]
je nastavena na tuto položku. Hodnota vybrané položky je uložena v proměnné REPLY
. V opačném případě, pokud je uživatelský vstup prázdný, výzva a seznam nabídek se zobrazí znovu.
select
smyčka bude pokračovat v běhu a bude vyžadovat zadání uživatele až do break
příkaz se provede.
Chcete-li ukázat, jak select
konstruktivní práce, podívejme se na následující jednoduchý příklad:
PS3="Enter a number: "
select character in Sheldon Leonard Penny Howard Raj
do
echo "Selected character: $character"
echo "Selected number: $REPLY"
done
Skript zobrazí nabídku sestávající z položek seznamu s doprovodným číslem a PS3
výzva. Když uživatel zadá číslo, skript vytiskne vybraný znak a číslo:
1) Sheldon
2) Leonard
3) Penny
4) Howard
5) Raj
Enter a number: 3
Selected character: Penny
Selected number: 3
Enter a number:
Bash select
Příklad #
Obvykle select
se používá v kombinaci s case
z if
prohlášení.
Podívejme se na praktičtější příklad. Je to jednoduchá kalkulačka, která uživatele vyzve k zadání a provádí základní aritmetické operace, jako je sčítání, odčítání, násobení a dělení.
PS3="Select the operation: "
select opt in add subtract multiply divide quit; do
case $opt in
add)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 + $n2 = $(($n1+$n2))"
;;
subtract)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 - $n2 = $(($n1-$n2))"
;;
multiply)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 * $n2 = $(($n1*$n2))"
;;
divide)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 / $n2 = $(($n1/$n2))"
;;
quit)
break
;;
*)
echo "Invalid option $REPLY"
;;
esac
done
Po spuštění skriptu se zobrazí nabídka a PS3
výzva. Uživatel je vyzván k výběru operace a poté k zadání dvou čísel. V závislosti na zadání uživatele skript vytiskne výsledek. Uživatel bude po každém výběru až do break
vyzván k provedení nové operace příkaz se provede.
1) add
2) subtract
3) multiply
4) divide
5) quit
Select the operation: 1
Enter the first number: 4
Enter the second number: 5
4 + 5 = 9
Select the operation: 2
Enter the first number: 4
Enter the second number: 5
4 - 5 = -1
Select the operation: 9
Invalid option 9
Select the operation: 5
Jednou nevýhodou tohoto skriptu je, že může pracovat pouze s celými čísly.
Zde je trochu pokročilejší verze. Používáme bc
nástroj, který podporuje plovoucí čísla pro provádění matematických výpočtů. Opakující se kód je také seskupen uvnitř funkce.
calculate () {
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 $1 $n2 = " $(bc -l <<< "$n1$1$n2")
}
PS3="Select the operation: "
select opt in add subtract multiply divide quit; do
case $opt in
add)
calculate "+";;
subtract)
calculate "-";;
multiply)
calculate "*";;
divide)
calculate "/";;
quit)
break;;
*)
echo "Invalid option $REPLY";;
esac
done
1) add
2) subtract
3) multiply
4) divide
5) quit
Select the operation: 4
Enter the first number: 8
Enter the second number: 9
8 / 9 = .88888888888888888888
Select the operation: 5
Závěr č.
select
konstrukt umožňuje snadno vytvářet nabídky. Je to užitečné zejména při psaní skriptů shellu, které vyžadují vstup uživatele.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.