Úvod do UNIXu – cvičení 13. 5. 2016

Domácí úkoly

  1. Nastudujte si, jak se zapisuje řídící struktura case a jak se používá vestavěný příkaz shellu getopts. Obojí najdete např. ve slajdech z přednášky, v man bash nebo i různě online. Mohlo by se vám to hodit na zkoušce a také při řešení následujícího úkolu. (0 bodů)
  2. Napište shellový skript, který se bude chovat podobně jako nástroj cut. Tj. bude rozpoznávat parametry -d a -f, které budou mít v zásadě týž formát a význam jako u cut. V dalších parametrech budou cesty k souborům. Pokud žádné nebudou uvedeny, měl by se jako okbvykle číst přímo standardní vstup. Rozdíl je v tom, že váš skript by měl na výstupu umístit sloupce v pořadí daném parametrem -f. V cut jsou totiž sloupce vypisované v pořadí, v jakém jsou ve vstupním souboru. Příklad použití je následující.
            
    # vypíše uživatele systému ve formátu "UID:login"
    ./cut.sh -d: -f 3,1 /etc/passwd
    # analogicky ve formátu "login:login:login"
    cat /etc/passwd | ./cut.sh -d : -f1,1,1
    # či ve formátu "UID:UID:GID:login"
    ./cut.sh -d : -f 3,3-4,1 < /etc/passwd
            
          
    Vyjma nástroje awk smíte použít cokoliv. Snažte se však držet standardu POSIX. (2 + 2 body)

Řešení domácích úkolů z minula

  1. Vytvořte shellový skript, který bude následující problém řešit čistě pomocí shellu, tj. bez nástrojů sed a awk. Chtěl bych navíc, aby vaše skripty byly dobře strukturovány. Zadefinujte v nich tedy vhodné funkce řešící parciální problémy. Častými kandidáty na zabalení do funkcí bývají např. těla cyklů, ale to je na vás.
    Váš skript by měl na standardním vstupu očekávat data po řádcích ve formátu "název souboru,seznam tagů oddělených mezerou". Pro každý tag by měl skript vyrobit shodně pojmenovaný soubor, a to v adresáři, který uživatel zvolí pomocí prvního parametru skriptu. Ten tedy musí být vyžadován. Každý soubor pro tag by pak měl na své první řádce obsahovat počet souborů mající daný tag přiřazený a na dalších řádcích by měl být uveden výčet těchto souborů.
    Např. pro následující vstup by měl skript spuštěný jako ./ukol.sh /tmp/neex/ vytvořit soubory /tmp/neex/historicky, /tmp/neex/valecny, /tmp/neex/cernobily a /tmp/neex/romanticky s výše naznačeným obsahem.
            
    ../Titanic-1997-HD.mp4,romanticky historicky
    The Longest Day (1962).mkv,historicky valecny cernobily
    /home/filmovymaniak/casablanca.avi,cernobily romanticky valecny
            
          
    Dbejte prosím na to, aby odevzdané skripty skutečně dělaly co mají. Částečná řešení totiž nejsou dost dobrá – stejně tak, jako u zkoušky, která vás čeká. (2 body)
            
    #!/bin/bash
    
    adresar="$1"
    
    if [ \( $# -ne 1 \) -o \( ! -d "$adresar" \) ]; then
      echo "Skript očekává cestu k adresáři." >&2
      exit 1
    fi
    
    
    pridej_soubor_k_tagu() {
    
      soubor="$1"
      tag=$2
    
      if [ ! -e "$adresar/$tag" ]; then
        echo 0 > "$adresar/$tag"
      fi
    
      mv -f "$adresar/$tag" "$adresar/$tag~"
    
      expr `head -n 1 "$adresar/$tag~"` + 1 > "$adresar/$tag"
      tail -n +2 "$adresar/$tag~" >> "$adresar/$tag"
      echo "$soubor" >> "$adresar/$tag"
    
      rm -f "$adresar/$tag~"
    }
    
    pridej_soubor_k_tagum() {
    
      soubor="$1"
      tagy="$2"
    
      for tag in $tagy; do
        pridej_soubor_k_tagu "$soubor" $tag
      done
    }
    
    
    old_IFS="$IFS"
    IFS=','
    
    while read soubor tagy; do
      IFS="$old_IFS"
    
      pridej_soubor_k_tagum "$soubor" "$tagy"
    
      IFS=','
    done
            
          

Příkazy a úkoly na cvičení