| SKRIPTY | |
|---|---|
| true | vrátí úspěšný (nulový) návratový kód |
| false | vrátí neúspěšný (nenulový) návratový kód |
| test <podminka> | [ <podminka> ] | [[ <podminka> ]] | vyhodnotí danou podmínku a v závislosti na jejím splnění vrátí úspěšný či neúspěšný návratový kód; k testování existence specifických souborů slouží následující volby, jejichž argumentem je název souboru: -e jakýkoliv soubor, -f běžný soubor, -b blokové zařízení, -c znakové zařízení, -d adresář, -h symbolický odkaz, -s soubor s nenulovou velikostí, -r soubor s právem ke čtení, -w soubor s právem k zápisu, -x soubor s právem ke spuštění, -u soubor s SUID bitem, -g soubor s SGID bitem, -k soubor se sticky bitem, -p pojmenovaná roura, <soubor1> -nt <soubor2> soubor1 je novější než soubor2, <soubor1> -ot <soubor2> soubor1 je starší než soubor2; k testování celých čísel slouží operátory: -eq je rovno, -ne není rovno, -lt menší než, -le menší nebo rovno, -gt větší než, -ge větší nebo rovno; k testování řetězců: = je rovno, != není rovno, -z <retezec> délka řetězce je nulová, -n <retezec> délka řetězce je nenulová; rozšířené testování umožňují operátory: -a logické A (oba výrazy jsou pravdivé), -o logické NEBO (alespoň jeden výraz je pravdivý), ! logické NE (výraz je nepravdivý); při použití [[ ]] lze navíc testovat výrazy jako <retezec> = / == <vzor> (řetězec obsahuje vzor), <retezec> != <vzor> (řetězec neobsahuje vzor), <retezec> =~ <vzor> (řetězec odpovídá regulárnímu výrazu), ! <retezec> =~ <vzor> (řetězec neodpovídá regulárnímu výrazu), <retezec1> < <retezec2> nebo <retezec1> > <retezec2> (řetězec1 podle abecedy předchází nebo následuje řetězec2) a využít && pro vyhodnocení druhého výrazu pokud první skončil úspěšně, || pro vyhodnocení druhého výrazu pokud první skončil neúspěšně a () pro seskupování výrazů$ test -f *.txt | $ [ -f *.txt ](návratový kód je 0, existuje-li právě 1 soubor s příponou „.txt“) $ [[ -n $(find . -name "*.txt") ]](návratový kód je 0, existuje-li 1 a více souborů s příponou „.txt“) $ [ ! -d PROD ](návratový kód je 0, pokud adresář neexistuje) $ [[ abc == *c ]](návratový kód je 0, obsahuje-li řetězec „abc“ vzor „*c“) $ [[ "abc" =~ .*c ]](návratový kód je 0, odpovídá-li řetězec „abc“ regulárnímu výrazu „.*c“) $ [[ a < z ]](návratový kód je 0, předchází-li řetězec „a“ v abecedním pořadí řetězec „z“) $ [[ $(awk -F ":" '/^root/ {print $4}' /etc/passwd) -eq 0 ]](návratový kód je 0, je-li GID uživatele root 0) $ [ $? -ne 0 ] && echo $?(vypíše návratový kód předchozího příkazu, skončil-li neúspěšně) $ [ $PWD = $HOME ] && echo "doma" || pwd(vypíše „doma“, nachází-li se přihlášený uživatel v domovském adresáři, jinak zobrazí cestu k pracovnímu adresáři) # duid=$(awk -F ":" '{print $3}' /etc/passwd | sort | uniq -d); [[ -z "$duid" ]] && echo "NONE" || echo "$duid"(vypíše duplicitní UID v systému) |
| if <seznam>; then <seznam>; [elif <seznam>; then <seznam>;] ... [else <seznam>;] fi | if uvádí podmínku, je-li pravdou, pak then určí požadovanou akci, není-li pravdou, elif stanoví další podmínku a then určí další akci, jinak else určí akci alternativní, seznam podmínek ukončuje fi#!/bin/bash# Skript kontroluje, zda je přihlášený uživatel root. Pokud je uživatel root, vyzve k zadání příkazů. Pokud uživatel není root, informuje jej, že nemá povoleno spouštět skript a ukončí se s chybovou zprávou.if [[ $EUID -ne 0 ]]; thenecho "Uzivatel '$(whoami)' neni opravnen spustit ${0##*/}."exit 1firead -p "Zadejte sve prikazy: " prikazyeval "$prikazy"echo "Skript byl uspesne dokoncen."#!/bin/bash# Skript ověří, zda je zadaný balíček nainstalován.echo -n "Zadejte nazev balicku: "while read PACKAGEdorpm -q $PACKAGE > /dev/nullif [ $? -eq 0 ]thenecho "ANO, $PACKAGE je nainstalovan."elseecho "NE, $PACKAGE neni nainstalovan."fi. $0done |
| case <slovo> in <vzor>[|<vzor>]...) <seznam>;; esac | vykoná příkaz na základě shody slova se vzorem; slovo představuje libovolnou proměnnou, vzor „*“ uvádí akci, pokud shoda nenastane, seznam vzorů ukončuje „)“ a skupina příkazů se zakončí „;;“#!/bin/bash# Skript podle operace nainstaluje, aktualizuje či odinstaluje daný balíček.echo -n 'Zadejte operaci a balicek: 'read OPERACE BALICEKcase $OPERACE innainstaluj) yum install -y $BALICEK;;aktualizuj) yum update -y $BALICEK;;odinstaluj|smaz) yum remove -y $BALICEK;;*) echo 'Neznama operace.'echo 'Pouziti: {nainstaluj|aktualizuj|odinstaluj|smaz} <balicek>';;esac |
| read <promenna ...> | čte řádek ze STDIN, rozdělí ho na slova a ta přiřadí danému počtu proměnných v odpovídajícím pořadí pro další zpracování; pokud je více slov než proměnných, zbývající slova a jejich oddělovače jsou přiřazeny poslední proměnné, pokud je proměnných více než slov, zbývajícím proměnným jsou přiřazeny prázdné hodnoty, -a <indexovane_pole> určí indexované pole, kde jsou slova přiřazena k sekvenčním indexům, -n <n> čte pouze daný počet znaků, -p <vyzva> určí výzvu, která se uživateli zobrazí před čtením vstupu, -r ruší znaku „\“ speciální význam, -s nezobrazí žádné znaky na vstupu, -t <n> nastaví časový interval v sekundách pro čtení vstupu$ cat cisla.txt | { read a; read b; read c; echo "$a/$b/$c";}(čte první tři řádky souboru, které vypíše na jeden řádek za sebou oddělené lomítkem) #!/bin/bash# Skript vyzve uživatele k zadání jména a hesla a potvrdí jeho přijetí.echo -n "Jmeno: "; read jmenoecho -n "Heslo: "; read -s hesloechoecho "Heslo pro $jmeno zadano." |
| while <seznam1>; do <seznam2>; done | spouští opakovaně „seznam2“, dokud „seznam1“ vrací úspěšný návratový kód#!/bin/bash# Skript otvírá čtyři terminálová okna.i=0while [ $i -lt 4 ]; do xterm &i=$[$i+1]; done#!/bin/bash# Skript vytváří soubor s informacemi o právě přihlášených uživatelích v intervalu pěti minut.while true; dowho > info-$(date | awk '{print $2,$3,$4,$6}' | sed 's/ /_/g').txtsleep 300; done#!/bin/bash# Skript vyzve uživatele k zadání jména vzdáleného počítače, na kterém spustí příkaz, který zjistí verzi distribuce Linuxu a výsledek uloží do souboru na lokálním počítači.echo -n "Jmeno pocitace: "; while read hostname; do ssh $hostname 'echo "Distribuce Linuxu": $(cat /etc/redhat-release)' > ${hostname}_info && echo -n "Jmeno pocitace: "; done |
| until <seznam1>; do <seznam2>; done | spouští opakovaně „seznam2“, dokud „seznam1“ vrací neúspěšný návratový kód#!/bin/bash# Skript vypíše čísla od 0 do 99.a=-1until [ $a -eq 99 ]; doa=$(expr $a + 1)echo $a; done#!/bin/bash# Skript kopíruje soubory z domovského do webového adresáře, kde každou hodinu vytvoří nový adresář, přičemž v případě jeho zaplnění na více než 90 % smaže adresáře starší 30 dní.while true; doDISKFUL=$(df -h $WEBDIR | grep "^/" | \ awk '{print $5}' | cut -d "%" -f1 -)until [ $DISKFUL -ge 90 ]; doWEBDIR=/var/www/webcamDATE=$(date +%Y%m%d)HOUR=$(date +%H)mkdir $WEBDIR/"$DATE"while [ $HOUR -ne 00 ]; doPICDIR=/home/user/picsDESTDIR=$WEBDIR/"$DATE"/"$HOUR"mkdir "$DESTDIR"cp $PICDIR/*.jpg "$DESTDIR"/sleep 3600HOUR=$(date +%H); doneDISKFULL=$(df -h $WEBDIR | grep "^/" | \awk '{print $5}' | cut -d "%" -f1 -)doneTOREMOVE=$(find $WEBDIR -type d -mtime +30)for i in $TOREMOVE; dorm -rf "$i"; donedone |
| for <promenna> [in <slovo> ...;] do <seznam>; done | přiřadí proměnné postupně hodnotu všech slov nebo všech pozičních parametrů skriptu a provede seznam příkazů pro každou z položek#!/bin/bash# Skript zobrazí každý argument příkazového řádku spolu s jeho odpovídajícím číslem.count=1for arg; doecho "Argument $count: $arg"((count++))done#!/bin/bash# Skript vytvoří uživatele uvedené v souboru „uzivatele“ v pracovním adresáři, přidá je do skupiny „admins“ a nastaví heslo „password“.for uzivatel in $(cat uzivatele); douseradd -g admins $uzivatelecho password | passwd --stdin $uzivateldone#!/bin/bash# Skript vypíše obsah pracovního adresáře.for x in $(ls -F)doecho "V adresari $(pwd) se nachazi soubor ci adresar: $x"done#!/bin/bash# Skript spočítá počet položek v pracovním adresáři.POC=0for nazev in *doPOC=$(($POC+1))doneecho "V adresari $(pwd) je $POC polozek."#!/bin/bash# Skript změní formát všech souborů .tif na .jpg.for pic in *.tif; doconvert "$pic" "$(echo "$pic" | sed 's/\.tif/.jpg/')"done#!/bin/bash# Skript zjistí, které z uvedených procesů běží, vypíše jejich jména včetně počtu řádků, které zabírají a nakonec zobrazí výpis všech běžících procesů a celkový počet řádků.services="httpd pmon lsnr sap"for service in $servicesdo running_processes="$(ps -ef | grep $service | egrep -v 'grep|vnc|client|API')"if [ -n "$running_processes" ]then echoecho $service:echoecho "$running_processes"echoecho "radku: $(echo "$running_processes" | wc -l)"echoecho "=========="fidoneechoecho "Souhrn:"echops -efechoecho "radku: $(ps -ef | wc -l)"#!/bin/bash# Skript se připojí ke všem serverům, jejichž IP adresy jsou uvedeny v souboru „servers“, na nich spustí příkazy, které zjistí jméno serveru a všechny jeho IP adresy a výsledek zapíše do souboru v lokálním počítači.for ip in $(< servers); do ssh $ip 'hostname; ifconfig | awk '/inet / {print $2}' | grep -v 127.0.0.1' >> servers_info.txt; done#!/bin/bash# Skript se připojí ke vzdáleným počítačům, na kterých nainstaluje software pro danou službu, kterou poté nastartuje a ověří její status.for x in {a..c}; do echo "=== node${x} ==="; ssh node${x} 'yum install -y device-mapper-multipath; systemctl enable --now multipathd; systemctl status multipathd'; echo; done |
| select <promenna> [in <slovo> ...;] do <seznam>; done | přiřadí proměnné postupně hodnotu všech slov nebo všech pozičních parametrů skriptu, jejichž očíslovaný seznam zobrazí společně s výzvou pro uživatele k zadání čísla položky a poté provede seznam příkazů pro vybranou položku (interaktivní obdoba příkazu „for“); přečtený řádek se uloží do proměnné „REPLY“#!/bin/bash# Skript zobrazí menu s nabídkou služeb. Po vybrání jedné z nich se objeví vnořené menu s nabídkou operací, které lze provést.while true; doPS3="Vyberte sluzbu nebo odejdete: "select svc in cups httpd sshd odejitdocase $svc incups)PS3="Vyberte operaci nebo odejdete: "select opt in start stop restart status odejitdocase $opt instart)systemctl start cupsbreak;;stop)systemctl stop cupsbreak;;restart)systemctl restart cupsbreak;;status)systemctl status cupsbreak;;odejit)break;;*)echo "Neplatna volba $REPLY"break;;esacdonebreak;;httpd)PS3="Vyberte operaci nebo odejdete: "select opt in start stop restart status odejitdocase $opt instart)systemctl start httpdbreak;;stop)systemctl stop httpdbreak;;restart)systemctl restart httpdbreak;;status)systemctl status httpdbreak;;odejit)break;;*)echo "Neplatna volba $REPLY"break;;esacdonebreak;;sshd)PS3="Vyberte operaci nebo odejdete: "select opt in start stop restart status odejitdocase $opt instart)systemctl start sshdbreak;;stop)systemctl stop sshdbreak;;restart)systemctl restart sshdbreak;;status)systemctl status sshdbreak;;odejit)break;;*)echo "Neplatna volba $REPLY"break;;esacdonebreak;;odejit)break 2;;*)echo "Neplatna volba $REPLY";;esacdone; done |
| break [<n>] | ukončí definitivně daný cyklus ve smyčce „for“, „while“, „until“, nebo „select“ na základě určitých kritérií, n určí počet úrovní vnořených cyklů#!/bin/bash# Skript spustí smyčku, která by měla procházet cykly od 1 do 5, ale předčasně ji ukončí během třetího cyklu, když hodnota proměnné „cyklus“ dosáhne 3.for cyklus in {1..5}; doif [ "$cyklus" -eq 3 ]; thenecho "Prerusuji behem cyklu $cyklus"breakfiecho "Cyklus: $cyklus"doneecho "Smycka skoncila." |
| continue [<n>] | přeskočí daný cyklus ve smyčce „for“, „while“, „until“, nebo „select“ na základě určitých kritérií a pokračuje v dalším, n určí úroveň cyklu#!/bin/bash# Skript spustí smyčku, která by měla procházet cykly od 1 do 5, ale přeskočí třetí cyklus, když hodnota proměnné „cyklus“ dosáhne 3 a pokračuje v dalším cyklu.for cyklus in {1..5}; doif [ "$cyklus" -eq 3 ]; thenecho "Preskakuji cyklus $cyklus"continuefiecho "Cyklus: $cyklus"done#!/bin/bash# Skript převádí velká písmena v názvech souborů na malá.LIST=$(ls)for nazev in $LIST; doif [[ $nazev != *[[:upper:]]* ]]; thencontinue; fiORIG=$nazevNEW=$(echo $nazev | tr 'A-Z' 'a-z')mv $ORIG $NEWecho "Novy nazev pro $ORIG je $NEW"done |
| getopts <seznam_voleb> <jmeno> [<argumenty>] | rozdělí (zpracuje) poziční parametry (volby a argumenty), které jsou předány shellovému skriptu; <seznam_voleb> určí seznam podporovaných znaků voleb, následuje-li za znakem dvojtečka (:), očekává se, že volba bude mít argument, je-li dvojtečka před prvním znakem, potlačí se hlášení chyb; při každém volání „getopts“ získá další volbu z pozičních parametrů a umístí znak volby do proměnné <jmeno>, pokud volba neodpovídá těm, které jsou definovány v <seznam_voleb>, „getopts“ nastaví proměnnou <jmeno> na otazník (?) a pokud je potlačeno hlášení chyb, nalezený znak volby se umístí do proměnné „OPTARG“; vyžaduje-li volba argument, „getopts“ umístí tento argument do proměnné „OPTARG“, pokud není nalezen požadovaný argument a je potlačeno hlášení chyb, umístí se dvojtečka do proměnné <jmeno> a „OPTARG“ se nastaví na nalezený znak volby; při spuštění skriptu musí volby, které vyžadují argument, následovat jejich argumenty, než se použije další volba#!/bin/bash# Skript povolí pro své spuštění používat pouze přesně definované volby a očekávané argumenty.pouziti() {echo "Pouziti: $0 {-x|-y <retezec>}"exit 1}[[ ! "$@" =~ -.+ ]] && pouzitiwhile getopts :xy: volbadocase $volba inx)echo "Je pouzita volba '-x'.";;y)echo "Je pouzita volba '-y' s argumentem '$OPTARG'.";;\?)echo "Neplatna volba '-$OPTARG'."pouziti;;:)echo "Volba '-$OPTARG' vyzaduje argument."pouziti;;esacdone |
| exit [<n>] | ukončí skript s daným návratovým kódem, není-li uveden, návratovým kódem skriptu je návratový kód posledního příkazu spuštěného uvnitř skriptu |
| FUNKCE | |
|---|---|
| function <funkce> { <seznam>;} | <funkce> () { <seznam>;} | definuje funkci, jejíž obsah je uzavřen do složených závorek; funkce se provádí v běžném shellu a využívá se zejména v případech, kdy je třeba provést danou operaci (posloupnost příkazů) opakovaně; spustí se zadáním jejího názvu a standardně vrací návratový kód posledního provedeného příkazu, není-li stanoveno jinak příkazem „return“; uvnitř funkce lze příkazem „local“ definovat lokální proměnnou (ta se dědí i do vnořených funkcí), pokud existuje globální proměnná stejného názvu, je ve funkci potlačena; funkci lze používat trvale (i po dalším spuštění shellu) jejím uvedením v ~/.bashrc; informace o argumentech předaných skriptům či funkcím jsou uloženy ve zvláštních proměnných („$#“ = celkový počet argumentů, „$<n>“ = daný argument v pořadí v rozmezí 1–9, „${<n>}“ = daný argument v pořadí v libovolném rozmezí, „$*“ či „$@“ = všechny argumenty)# Funkce „test“ vytvoří soubor, který je zadán jako argument a nastaví mu příslušná přístupová práva. Pokud soubor stejného jména již existuje nebo zadaný název obsahuje pouze mezeru či zcela chybí, vypíše se chybové hlášení.function test{if ! [[ -e $* || $* = '' ]]; then touch $*; chmod 755 $*else echo "Chyba"fiecho "Počet argumentů: $#"echo "Všechny argumenty: $*"echo "Druhý argument: $2"}# Funkce „uzivatel“ zjistí, zda uživatel, který je zadán jako argument, existuje v systému, a pokud ano, vypíše o něm podrobné informace.uzivatel (){if [ $(grep -ic ^$1 /etc/passwd) -eq 0 ]; then echo "Uzivatel $1 neexistuje."else echo "Uzivatel $1 existuje." && finger $1fi}# Funkce „procento“ vypočítá procentuální hodnotu druhého číselného argumentu z prvního, přičemž první argument představuje hodnotu 100 %.procento () {local x=$1 y=$2printf "$x = 100 %%\n$y = x %%\n"echo "$y = $[$(( 100 * $y )) / $x] % z $x"}# Funkce „pouziti“ vypíše možné volby pro spuštění skriptu, pokud nebyla žádná platná volba použita, vrátí návratový kód 1.pouziti () { echo "Pouziti: $0 {-start|-stop|-restart}"; exit 1;} |
| local [<promenna>[=<hodnota>] ...] | definuje lokální proměnnou funkce, -a určí indexované pole, -A určí asociativní pole; bez argumentu zobrazí všechny lokální proměnné funkce |
| return [<n>] | ukončí funkci s daným návratovým kódem, není-li uveden, návratovým kódem funkce je návratový kód posledního příkazu spuštěného uvnitř funkce |
