Bash

Po instalaci

Vzhledem k tomu, že používám linux systémy založené na Debianu (Ubuntu, Mint, Nový Slackware, Devuan aj.), je možné, že se v uvedených příkazech vyskytnout nějaké rozdílnosti.

Základní věc, kterou bysme měli provést po naistalovanání systému je update dostupných balíčků, to jednoduše provedeme uvedenými příkazy:

Poznámka:

Příkazy, které potřebují na spuštění oprávnění root, je samozřejmě také možné spouštět pod běžným uživatelem je však nutné doinstalovat balíček sudo a nastavit sudo oprávněný uživateli.

# apt-get install sudo
# sudo usermod -aG sudo <username>

Nyní je možné přepnout se z roota na běžného uživatele a používat sudo:

# su <username>
$ sudo apt update
$ sudo apt upgrade

Bude však vždy vyžadovat heslo k vašemu uživatelskému účtu.

Nyní máme tedy na výběr mezi dvěmi možnostmi:

  1. znázorňuje update balíčků v případě, že jste přihlášení jako root:

    # apt update
    # apt upgrade
    
  2. pro běžného uživatele systému:

    $ sudo apt update
    $ sudo apt upgrade
    

Příkazy je také možné zřetezit, ale o tom až později.

Základní příkazy na ovládání systému

Mezi hlavní příkazy určitě patří příkaz ls, který slouží k vypsání obsahu adresáře:

ls # vypíše obsah odresáře
ls -a # vypíše obsah včetně souborů a adresářů začínájích tečkou
ls -l # vypíše obsah a zobrazí jako list
ls -al # vypíše obsah včetně souborů a adresářů začínájích tečkou a zobrazí jej jako list

Jak můžeme vidět na příkladu níže, pokud si uživatel honza vypíše obsah svého domovského adresáře, uvidí následující výstup.

honza@debian:~$ ls -l
celkem 120
drwxr-xr-x  3 honza honza   4096 led 18 18:39  bin
drwxr-xr-x  6 honza honza   4096 led 30 15:36  books
-rw-r--r--  1 hozna hozna     20 úno  7 20:45  exam
drwxr-xr-x  4 honza honza   4096 pro  7 21:19  github
drwxr-xr-x  2 honza honza   4096 úno  7 17:39  KeePassX
drwxr-xr-x  8 honza honza   4096 pro 16 18:37  Maildir
drwxr-xr-x  3 honza honza   4096 kvě  8  2017  obrázky
drwxr-xr-x  3 honza honza   4096 srp 14 16:29  others
drwxr-xr-x  3 honza honza   4096 led 18 18:39  Plocha
drwxr-xr-x  2 honza honza   4096 úno  7 14:56  Stažené
drwxr-xr-x  2 honza honza   4096 pro 16 18:22  Webkamera

Uvedený příkaz má nepřeberné mnoství přepínačů, které je možné jakkoliv kombinovat. Pro více informací doporučuji navšítit přímo manuálové stránky, případě použít přepínač –help.

$ man ls
$ ls --help

Zobrazení obsahu textového souboru se provádí pomocí příkazu cat, pokud si tedy bude honza přát zobrazit obsah souboru exam učiní tak následovně:

honza@debian:~$ cat exam
Jsemm linuxovej guru

Název příkazu je zkratkou slova catenate neboli zřetězit, spojit doromady.

Programování BASH

Poziční parametry

Poziční parametry jsou tvořeny názvem příkazu a argumenty příkazového řádku. Říká se jim poziční, protože v kódu skriptu se na ně odkazujeme prostřednictvím jejich umístnění (pozice) v příkazovém řádku.

$#: počet argumentů příkazového řádku

Parametr $# uchovává počet argumentů v příkazovém řádku, přičemž název programu není do tohoto počtu zahrnut:

$ cat count_arguments.sh
echo "Skript byl volán s $# argumenty"

$ ./count_arguments.sh java python bash go
Skript byl volán s 4 argumenty

$0: název volajícího programu

Shell uloží do parametru $0 název příkazu, kterým byl program volán. Parametr má číslo 0, protože je v příkazovém řádku uveden ještě před prvním argumentem.

$ cat name.sh
echo "Skript byl spuštěn příkazem $0"

$ ./name.sh
Skript byl spuštěn příkazem ./name.sh

$1 až $n: argumenty příkazového řádku

Prvním argumentem příkazového řádku je vyjádřen parametrem $1, druhý argument parametrem $2 a tak dále až po $n. Jestliže hodnota n přesáhne hodnotu 9, musí se číslo uzavřít do složených závorek ${15}.

$ cat display_9arguments.sh
echo "Predane argumenty: $1 $2 $3 $4 $5 $6 $7 $8 $9"

$ ./display_9arguments.sh Windows iOS Linux BSD Unix
Predane argumenty: Windows iOS Linux BSD Unix

Speciální parametry

Speciální příkazy dovolují přistupovat k různým užitečným hodnotám, týkající se argumentů příkazového řádku a provádění příkazů shellu.

$$: Číslo PID

Shell ukládá do parametru $$ číslo PID prováděného procesu. Pro ukázku použijeme skript z minulé ukázky, který si rozšíříme tak, aby nám vypsal PID procesu pod kterým běžel.

$ cat display_9arguments.sh
echo "Predane argumenty: $1 $2 $3 $4 $5 $6 $7 $8 $9"
echo "Skript běžel s PID $$"

$ ./display_9arguments.sh Windows iOS Linux BSD Unix
Predane argumenty: Windows iOS Linux BSD Unix
Skript běžel s PID 7559

$!: Hodnota PID posledního procesu

Hodnota PID posledního porcesu, který byl spuštěn na pozadí je uložena v parametru $!. Následující příklad spouští příkaz sleep (jeden z vestavěných příkazů) na pozadí a pomocí echo zobrazí hodnotu $!.

$ sleep 10 &
[1] 29664
$ echo $!
29664
[1]+  Done        sleep 10

Když je proces z libovolného důvodu ukončen, předá nadřízenému procesu svou návratovou hodnotu (exit status). V dokumentaci k Linuxu se pro tuto hodnotu vyskytují také pojmy jako condition code nebo return code. Proměnná $? uchovává návratovou hodnotu posledního příkazu. Podle zažitého zvyku představuje nenulová návratová hodnota (tedy hodnota > 0) logickou nepravdu false a vyjadřuje selhání příkazu nebo programu. Nula je brána jako logická pravda (tedy hodnota = 0) true a vyjadřuje úspěšný průběh programu.

Příklad použití - Výpis obsahu domovské adresáře:

$ ls -l ~ 
total 44
drwxr-xr-x 1 honza honza     0 Oct  9 20:54  Downloads
drwxr-xr-x 1 honza honza    48 Oct  5 20:27  Hackhaton
drwxr-xr-x 1 honza honza    26 Oct  9 20:54  KeePassX
drwxr-xr-x 1 honza honza   274 Feb 26  2018  Pictures
drwxr-xr-x 1 honza honza  1108 Feb 17  2018  Webkamera
$ echo $?
0

Použití příkazu cat na zobrazení neexistujícího souboru:

$ cat hack_java
cat: hack_java: No such file or directory
$ echo $?
1

Relační operátory

Relop Význam
-eq Rovno
-ge Větší než nebo rovno
-gt Větší než
-le Menší než nebo rovno
-lt Menší než
-ne Není rovno

Řídící struktury

Mezi řídící struktury patří příkazy if…then, for…in, while, until a case. Kromě toho se i někde vyskytují příkazy break a continue.

If…then

  1. Syntaxe vypadá následovně

    if *testovane-příkazy*
        then
            *příkazy*
    fi
    
  2. Příklad: Jednoduchý skript "porovnej.sh", který načte vstup od uživatele a otestuje zda se dvě slova rovnají:

    #!/usr/bin/env bash
    
    echo -n "1. slovo: "
    read slovo1
    echo -n "2. slovo: "
    read slovo2
    
    if test "$slovo1" = "$slovo2"
        then
            echo "Slova se shodují"
    fi
    

    Výsledek:

    $ ./porovnej.sh
    
    1. slovo: python
    2. slovo: python
    Slova se shodují
    

    V Bourne Again Shellu je test vysvtavěným příkazem, tedy součástí shellu. Existuje rovněž samostatný příkaz test uložený v adresáří /usr/bin/test. Můžete ověřit funčknost přímo v příkazovém řádku a to zadáním následujícího a otestovat na návratovou hodnotu:

    $ test "python" = "python"
    echo $?
    0
    

    Jak můžeme vidět návrtová hodnota je nula, tedy logická pravda true. Pokud zkusíme následující:

    $ test "python" = "bash"
    echo $?
    1
    

    Dostali jsem návratovou hodnotu 1, příkaz test tedy vrátil logickou hodnotu false.

  3. Přepínače vestavěného příkazu test

    Přepínač Testuje, zda soubor
    -d exstuje a jedná se o adresář
    -e existuje
    -f existuje a jedná se o běžný soubor
    -r existuje a je čitelný
    -s existuje a jeho velikost je větší než 0 bajtů
    -w existuje a lze do něj zapisovat
    -x existuje a je spustitelný

  4. [] je synonymum příkazu test

    Namísto slova test tedy lze v skriptech uzavřít zkoumané argumenty do hranatých závorek, kolem kterých musí být bílé znaky (MEZERY nebo znaky TAB).

    V příkladu níže budeme testovat, zda byl skriptu předán nějaký argument či nikoliv:

    $ cat args.sh
    
    #!/usr/bin/env bash
    
    if [ $# -eq 0 ]
        then
            echo "Použití: args.sh argument" 1>&2
            exit 1
    fi
    

    Pokud nyní spustíme skript bez argumentu vypíše na standardní chybový výstup: $ args.sh argument a skončí návratovou hodnotu 1. V případě, že skriptu dáme (v tomto případě) jakýkoliv argument, nedostatnem žádný výstup, ale skript skončí návratovou hodnotou 0, teda true.