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

  1. 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

  2. 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