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:
- # v případě, že se před příkazem ukazuje mřížka mám na mysli, že jste přihlášen jako root
- $ v případě dolaru se jedná o běžného uživatele
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:
-
znázorňuje update balíčků v případě, že jste přihlášení jako root:
# apt update # apt upgrade
-
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
$?: Návratová hodnota
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
-
Syntaxe vypadá následovně
if *testovane-příkazy* then *příkazy* fi
-
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.
-
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ý -
[] 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.