4. cvičení
Programování v shellu (Bash)
# Jako první řádek skriptu je nutné uvést cestu k bash pomocí
#!/bin/bash
# Přiřazení
number=10
letters=ABC
string="Hello World!"
#Vypis promennych
echo $number
echo "My number is $number"
# Při nejednoznačnosti názvu proměnné se používá ${a}
# Nevypíše hodnotu proměnné letters.
# Název proměnné je $lettersDEFG a ne $letters.
echo "Fisrt letters are $lettersDEFG"
# Reseni nejednoznacnosti
echo "Fisrt letters are ${letters}DEFG"
# Polaceni specialniho vyznamu $
echo "\$number = $number"
# Načítání vstupu
#read name
echo $name
# Uložení výsledku příkazu do proměnné
ls_result=$(ls -la)
echo $ls_result
# Aritmentické operace
# Zakladní operatory
#
# a + b sčítání
# a - b odčítání
# a * b násobení
# a / b dělení
# a % b modulo
# a ** b exponentiace
number=$(($number * $number + 20))
# Podmínky
# Zjištěni jestli má proměnná hodnotu. Použití například při zjíštění jestli byl zadán parametr
# Existuji operace -z (zero), -n (nonzero)
if [ -z $1 ]; then
echo "NO"
else
echo "YES"
fi
# Porovnavani čísel
# operatory: -eq (==), -ne (!=), -gt (>), -ge (>=), -lt (<), -le (<=)
if [ $number -eq 30 ]; then
echo "1. Variable \$number is equal to 30"
fi
# Pokud proměnná number neobsahuje hodnotu tak výše uvedené porovnání skončí chybou.
# Tento problém se dá vyřešit substitucí
unset number # Po provedení proměnná neobsahuje žádnou hodnotu
# Vyraz ${number-30} říká že pokud $number nemá hodnotu nahraď ji hodnotou 30
if [ ${number-30} -eq 30 ]; then
echo "2. Variable \$number is equal to 30"
fi
echo $number # Number stále nemá žádnou hodnotu
# Výraz ${number:=30} říká že pokud $number nemá hodnotu tak proveď přiřazení na hodnotu 30
if [ ${number:=30} -eq 30 ]; then
echo "3. Variable \$number is equal to 30"
fi
echo $number # Zde ma number hodnotu 30
# Porovnavaní čísel 2
number=60
unset number
if (( ${number-60} == 60)); then
echo "1. Variable \$number is equal to 60"
fi
# Jine řešení substituce
if (("x$number" == "x60")); then
echo "2. Variable \$number is equal to 60"
fi
# Porovnávání řetězců
# operatory: =, ==, <, >,
# POZOR [ "$a"="$b" ] není ekvivalentní s [ "$a" = "$b" ]
name_1="John"
name_2="Jimmy"
if [ "$name_1" = "$name_2" ]; then
echo "Name are not equal"
fi
# Rozhodování pomocí IF
if [ "$name_1" = "John" ]; then
echo "\$name_1 = John"
fi
# Else
if [ "$name_1" = "John" ]; then
echo "\$name_1 = John"
else
echo "\$name_1 != John"
fi
# Else-If
if [ "$name_1" = "John" ]; then
echo "\$name_1 = John"
elif [ "$name_2" = "Jimmy" ]; then
echo "\$name_2 = Jimmy"
else
echo "\$name_1 = $name_1 and \$name_2 = $name_2"
fi
# Složitejší podmínky
number=50
if [ $number -gt 30 ] && [ $number -lt 200 ]; then
echo "Number is between 30 and 200"
fi
# Ekvivalentní s předchozím
if [[ $number -gt 30 && $number -lt 200 ]]; then
echo "Number is between 30 and 200"
fi
# Case
mycase=1
case $mycase in
1) echo "You selected bash";;
2) echo "You selected perl";;
3) echo "You selected phyton";;
4) echo "You selected c++";;
5) exit
esac
# Cyklus for
# Počet iterací zadaný výčtem prvků
for i in 1 2 3 4 5; do
echo "Welcome $i times"
done
# Počet iterací zadaný rozsahem. Podporuje Bash verze 3.0+
for i in {1..5}; do
echo "Welcome $i times"
done
echo "Bash version ${BASH_VERSION}..."
# Počet iterací zadaný pomocí dolní a horní hranice a kroku. Dostupné od verze 4
for i in {0..10..2}
do
echo "Welcome $i times"
done
# C-style for cyklus
for (( c=1; c<=5; c++ )); do
echo "Welcome $c times"
done
# Nekonečný cyklus
for (( ; ; )); do
echo "infinite loops [ hit CTRL+C to stop]"
break;
done
# Cyklus while
count=4
while [ $count -gt 0 ]; do
echo "Value of count is: $count"
count=$(($count - 1))
done
# Cyklus until
count=1
until [ $count -gt 5 ]; do
echo "Value of count is: $count"
count=$(($count + 1))
done
# Dale v bashi existuje break a continue a použití je stejné jako v jiných programovacích jazycích.
Spuštění skriptu
# Pomocí příkazu bash
roman@virtual ~ $ bash script.sh
# Nebo přídáme souboru práva spouštění
roman@virtual ~ $ chmod u+x script.sh
# Následně sktript spustíme
roman@virtual ~ $ ./script.sh
Úkoly
Obě Skupiny 16:45-18:15
-
Naprogramujte "hádání" (celého) čísla, které si uživatel myslí, z intervalu zadaného až dvěma parametry, sérií dotazů "je menší/větší než X?" algoritmem půlení intervalu. Při jednom parametru je první číslo 0, při žádném navíc druhé 100..
1 bod
-
Implementujte zjednodušenou verzi programu
seq
výpis posloupnosti (celých) čísel oddělených mezerou od čísla zadaného jako první parametr do čísla zadaného jako třetí parametr, obojí včetně, s přírůstkem zadaným jako druhý parametr, pokud je počáteční číslo menší nebo rovno než cílové pro kladný přírůstek a obráceně. Při dvou parametrech je chybějící přírůstek roven 1, při jednom parametru je i chybějící počáteční číslo rovno 1.1 bod