5. cvičení


Programování v shellu (Bash)

    
    # Retezce

    string="Unix is the best"

    # Delka retezce
    echo ${#string}

    # Podretezec
    # Syntaxe: ${string::}
    string="Unix is the best"
    ${string:1:1}

    # Index podretezce
    string="Unix is the best"
    substring="t"
    expr index "$string" "$substring" # -> Prvni vyskyt t je na indexu 8

    # Pokud vynechame delku podretezce tak se pokracuje az do konce
    string="Unix is the best"
    echo ${string:1}           # $string bez prvniho znaku
    echo ${string:12}          # best

    # Nahrazeni retezce

    # Nahrazeni prvniho vyskytu
    string="Unix is the best. Unix"
    echo ${string[@]/Unix/Windows}  # Windows is the best, Unix

    # Nahrazeni vsech vyskytu

    string="Unix is the best. Unix"
    echo ${string[@]//Unix/Windows} # Windows is the best, Windows

    # Odstraneni podretezce (nahrazeni prazdnym)
    string="Unix is the best. Unix"
    echo ${string[@]// the/} # Unix is best. Unix

    # Funkce

    # Definice funkce
    function add {
        echo $(($1 + $2))
    }

    # Volani funkce je totozne s volanim prikazu
    add 1 1

    # Pokud chceme ulozit vysledek do promenne tak musime v tele funkce pouzit echo

    sum=$(add 2 2)

    echo $sum


    # Prace se soubory

    # Existence souboru

    filename="text.txt"
    if [ -e "$filename" ]; then
        echo "File $filename exists"
    fi

    # Existence adresare

    directory_name="unix"
    if [ -d "$directory_name" ]; then
        echo "Directory $directory_name exists"
    fi


    # Pole

    #Deklarace pole
    array=(Homer Marge "The Simpsons" Magie)

    # Prirazeni
    array[2]=Bart

    # Delka pole
    echo  ${#array[@]}

    # Pridani prvku do pole
    array[4]="Lisa"
    echo ${#array[@]}                    # 5
    echo ${array[${#array[@]}-1]}     # Magie

    # Append
    array+="Ned"

    # Vypis pole
    printf '%s\n' "${array[@]}"

        
    

Úkoly

Obě Skupiny

  1. Napište funkce convert_to_decimal a convert_from_decimal. Funkce convert_to_decimal bere dva argumenty první je číslo a druhy je poziční soustava (2 až 64). Funkce převede číslo do desítkové soustavy. Funkce convert_from_decimal bere také dva argumenty, kde první je číslo v desítkové soustavě a druhý argument je soustava do které mame číslo převést. Čísla větší než 9 jsou malá a velká písmena anglické abecedy a znaky @ a _.

        parallels@ubuntu:/media/psf/PhD/UNIX/Lectures$ ./homework_8.sh
        convert_from_decimal 222 3 -> 22020
        convert_from_decimal 222 16 -> de
        convert_from_decimal 222 32 -> 6u
    
        convert_to_decimal 22020 3 -> 222
        convert_to_decimal de 16 -> 222
        convert_to_decimal 6u 32 -> 222
    

    1 bod

  2. Implementujte jako funkce (zjednodušené) programy dirname a basename: z cesty zadané jako parametr, po odebrání případného / na konci, vrátí (vypíše) část do a od poslední / (bez něj, pokud to není jediný znak). Pokud již cesta / neobsahuje, dirname vrátí '.' a basename celé jméno.

        parallels@ubuntu:/media/psf/PhD/UNIX/Lectures$ ./homework_9.sh /media/psf/PhD/UNIX/
        basename
        UNIX
        dirname
        /media/psf/PhD
    
        parallels@ubuntu:/media/psf/PhD/UNIX/Lectures$ ./homework_9.sh /media/psf/PhD/UNIX/Lectures/homework_9.sh
        basename
        homework_9.sh
        dirname
        /media/psf/PhD/UNIX/Lectures
    

    1 bod

  3. V systému bývá zvykem, že se u logů provadí tzv. rotace. Soubor xy se přejmenuje na xy.0, xy.0 na xy.1 atd. až do nějaké horní hranice, soubory s číslem nad touto hranicí se vymažou. Napište program, který dostává dva parametry - jméno souboru a maximální počet uložených kopií (lze vynechat, implicitní hodnota je 30) - a proveďte rotaci.

    1 bod