#### {% title "Bash w przykładach" %}

<!-- opracował Robert Fidytek -->

# Bash w przykładach

<blockquote>
  {%= image_tag "/images/algorithm.png", :alt => "[Rozwiązanie…]" %}
</blockquote>

1\. Podaj przykład skryptu wykorzystującego zmienne i
zmienne środowiskowa np. $USER, $PWD, $HOME.

    :::shell-unix-generic
    #!/bin/bash
    echo "Czesc $USER"
    echo "twoj aktualny katalog to $PWD"
    zmienna="a to twoj katalog domowy to $HOME"
    echo $zmienna
    echo "nazwa twojego hosta to: $HOSTNAME"
    echo "korzystasz z systemu operacyjnego: $OSTYPE"
    zmienna2=$(pwd)
    echo "\"Ciapki\" – przyklad: $zmienna2"
    exit 0

2\. Podaj przykład skryptu korzystującego ze zmiennych
specjalnych, czyli użyj $0, $1, $2, …, $9, $@, $*, $?, $$.

    :::shell-unix-generic
    #!/bin/bash
    echo "Nazwa biezacego skryptu: $0"
    echo "Pierwszy przekazany parametr do skryptu: $1"
    echo "Drugi przekazany parametr do skryptu: $2"
    echo "..."
    echo "Dziewiaty przekazany parametr do skryptu: $9"
    # separatorem będzie spacja
    echo "Skrypt uruchomiono z parametrami: $@"
    # separator okresla zmienna $IFS
    echo "Skrypt uruchomiono z parametrami: $*"
    echo "Kod powrotu ostanio wykonywanego polecenia: $?"
    echo "PID procesu biezacej powloki: $$"
    exit 0

3\. Podać przykład skryptu korzystającego z tablic 
(Użyj declare, unset, *, @, # ).

    :::shell-unix-generic
    owoc[0]="jablko"
    owoc[1]="gruszka"
    owoc[2]="sliwka"
    owoc[3]="wisnia"
    echo "Pierwszy element tablicy owoc to: ${owoc[0]}"
    echo "Wszystkie elementy tablicy owoc to: ${owoc[*]}"
    echo "Wszystkie elementy tablicy owoc to: ${owoc[@]}"
    echo "Drugi element tablicy owoc ma ${#owoc[1]} znakow"
    echo "Tablica owoc ma ${#owoc[*]} elementy"
    imie=(Jola Ania Kasia Basia Magda)
    echo "Wszystkie elementy tablicy imie to: ${imie[@]}"
    unset imie  # usuniecie tablicy
    echo "Tablica imie ma ${#imie[*]} elementow"
    tab1=(`cat /etc/passwd`)
    echo "Tablica tab1 ma ${#tab1[*]} elementow"
    declare tab2=(`cat /etc/passwd`)
    echo "Tablica tab2 ma ${#tab2[*]} elementow"
    exit 0

4\. Napisać skrypt obliczający sumę, różnicę i iloczyn dwóch
wczytanych liczb całkowitych. (Użyj polecenia read.)

    :::shell-unix-generic
    #!/bin/bash
    echo -n "Podaj pierwsza liczbe: "
    read liczba1
    echo -n "Podaj druga liczbe: "
    read liczba2
    echo
    suma=$[liczba1 + liczba2] #1 sposob
    echo "Suma liczb wynosi: $suma"
    roznica=$((liczba1-liczba2)) #2 sposob
    echo "Roznica liczb wynosi: $roznica"
    let iloczyn=liczba1*liczba2 #3 sposob
    echo "Iloczyn liczb wynosi: $iloczyn"
    iloraz=$[liczba1/liczba2]
    echo "Iloraz liczb wynosi: $iloraz" #czesc calkowita
    modulo=$[liczba1%liczba2]
    echo "Modulo liczb wynosi: $modulo" #reszta
    exit 0

5\. Napisać skrypt sprawdzający, czy w katalogu głównym użytkownika
istnieje plik *.bashrc*. (Użyj instrukcji warunkowej if.)

    :::shell-unix-generic
    if [ -e ~/.bashrc ]
    # lub rownowaznie: if test -e ~/.bashrc
    then echo "Masz plik .bashrc"
    else echo "Nie masz pliku .bashrc"
    fi
    exit 0

Krótka ściąga z pozostałych warunków:

<table class="span-19" summary="Scaffold">
  <colgroup>
    <col class="table1"/>
    <col class="table2"/>
  </colgroup>
<tbody>
 <tr>
 <td>-d plik</td>
 <td>plik jest katalogiem</td>
 </tr>
 <tr>
 <td>-e plik</td>
 <td>plik istnieje</td>
 </tr>
 <tr>
 <td>-f plik</td>
 <td>plik jest plikiem regularnym</td>
 </tr>
 <tr>
 <td>-g plik</td>
 <td>plik ma przypisany set-group-id</td>
 </tr>
 <tr>
 <td>-r plik</td>
 <td>plik daje się odczytac</td>
 </tr>
 <tr>
 <td>-s plik</td>
 <td>plik ma niezerowy rozmiar</td>
 </tr>
 <tr>
 <td>-u plik</td>
 <td>plik ma przypisany set-user-id</td>
 </tr>
 <tr>
 <td>-w plik</td>
 <td>plik można edytowac (można pisac))</td>
 </tr>
 <tr>
 <td>-x plik</td>
 <td>plik wykonywalny</td>
 </tr>
</tbody>
</table>



6\. Napisać skrypt pytający się czy już jest wieczór. Dla odpowiedzi
„tak” powinien wypisać „Dobry wieczor”, dla odpowiedzi „nie” – 
„Dzien dobry”, dla pozostałych odpowiedzi „Nie rozpoznana odpowiedz: ” 
i przytoczyć treść odpowiedzi. (Użyj instrukcji warunkowej if-elif.)

    :::shell-unix-generic
    #!/bin/bash
    echo -n "Czy jest wieczor? Odpowiedz tak lub nie: "
    read odp
    if [ "$odp" = "tak" ]
    then echo "Dobry wieczor"
    elif [ "$odp" = "nie" ]
    then echo "Dzien dobry"
    else
      echo "Nie rozpoznana odpowiedz: $odp"
      exit 1
    fi
    exit 0

Jeszcze jedna ściąga:

<table class="span-19" summary="Scaffold">
  <colgroup>
    <col class="table1"/>
    <col class="table2"/>
  </colgroup>
<tbody>
 <tr>
 <td>ciąg</td>
 <td>ciąg jest niepusty</td>
 </tr>
 <tr>
 <td>ciąg1=ciąg2</td>
 <td>ciągi sa jednakowe</td>
 </tr>
 <tr>
 <td>ciąg1!=ciąg2</td>
 <td>ciągi nie sa rowne</td>
 </tr>
 <tr>
 <td>-n ciąg</td>
 <td>ciąg nie jest NULL</td>
 </tr>
 <tr>
 <td>-z ciąg</td>
 <td>ciąg jest NULL (pusty)</td>
 </tr>
</tbody>
</table>


7\. Napisać skrypt pobierający numer dnia tygodnia i wypisujący jego
nazwę lub informację „Nie rozumiem”. (Użyj polecenia read i
instrukcji warunkowej case.)

    :::shell-unix-generic
    #!/bin/bash
    echo "Podaj numer dnia tygodnia: "
    read dzien
    case "$dzien" in
      "1") echo "poniedzialek" ;;
      "2") echo "wtorek" ;;
      "3") echo "sroda" ;;
      "4") echo "czwartek" ;;
      "5") echo "piatek" ;;
      "6") echo "sobota" ;;
      "7") echo "niedziela" ;;
      *) echo "Nie rozumiem"
    esac
    exit 0

8\. Wyświetlić z bieżącego katalogu nazwy wszystkich plików: 
\*.html, \*.htm, *.php, *.css, *.gif, *.jpg. (Użyj pętli for.)

    :::shell-unix-generic
    #!/bin/bash
    for nazwa in *.html *.htm *.php *.css *.gif *.jpg
    do
    echo $nazwa
    done
    exit 0

To samo, ale bez rozróżniania małych i dużych liter.

9\. Napisać skrypt wykonujący pętlę 15 razy i wypisujący za każdym
razem numer obiegu pętli. (Użyj pętli while.)

    :::shell-unix-generic
    #!/bin/bash
    n=1;
    # gdy warunek stanie się fałszywy to petla zakonczy dzialanie
    while [ $n -le 15 ]
    do
      echo "Petla wykonuje sie po raz: $n"
      n=$[n + 1]
    done
    exit 0

Ściąga z operatorów wykorzystywanych w warunkach:

<pre>-eq (==)    -ne (!=)   -lt (&lt;)
-le (&lt;=)    -gt (>)    -ge (>=)
</pre>

10\. Napisać skrypt sprawdzający, czy użytkownik, którego login został
podany jako parametr skryptu zalogował się. (Użyj pętli until.)

    :::shell-unix-generic
    #!/bin/bash
    until who | grep "$1" > /dev/null
    # gdy warunek stanie się prawdziwy to petla zakonczy dzialanie
    do
      sleep 60
    done
    echo -e \\a
    echo "$1 wlasnie sie zalogowal !!! "
    exit 0

11\. Napisać skrypt pytający się użytkownika co wybiera: kawe,
herbate, sok, quit. Po dokonaniu wyboru powinna się pojawić
informacja co zostało wybrane. Po wybraniu quit skrypt powinien
zakończyć działanie. (Użyj pętli select i instrukcji warunkowej case.)

    :::shell-unix-generic
    #!/bin/bash
    echo "Co wybierasz?"
    select x in kawe herbate sok quit
    do
      case $x in
        "kawe") echo "Wybrales kawe." ;;
        "herbate") echo "Wybrales herbate." ;;
        "sok") echo "Wybrales sok." ;;
        "quit") echo "Wybrales quit."; break ;;
        *) echo "Nic nie wybrales."
      esac
    done
    exit 0

12\. Zmienić nazwy plików i katalogów pisane dużymi literami na nazwy
pisane małymi literami.

    :::shell-unix-generic
    #!/bin/bash
    for nazwa in *
    do
      mv $nazwa $(echo $nazwa | tr '[A-Z]' '[a-z]')
    done
    exit 0