Uživatelské nástroje

Nástroje pro tento web


skripty-a-funkce

Skripty a funkce


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ží různé přepínače, jejichž parametrem je název souboru - např. -e jakýkoliv soubor, -f řádný 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, <soubor1> -nt <soubor2> soubor1 je novější než soubor2, <soubor1> -ot <soubor2> soubor1 je starší než soubor2; k testování číselných hodnot 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á; pro negaci výrazu slouží ! <vyraz>; při použití [[ ]] lze navíc testovat následující výrazy: <retezec> = / == <vzor>, <retezec> != <vzor>, <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 ]
(příkaz vrátí kód 0, existuje-li právě 1 soubor s příponou „.txt“)
$ [[ -n $(find . -name "*.txt") ]]
(příkaz vrátí kód 0, existuje-li 1 a více souborů s příponou „.txt“)
$ [[ abc == *c ]]
$ [[ a < z ]]
$ [ $PWD = $HOME ] && echo "doma" || pwd
$ [[ -n $(rpm -qa | egrep "^sudo") && $(stat -c %s /etc/sudoers) -gt 0 ]] && echo "Sudo se používá." || echo "Sudo se nepoužívá."
# duid=$(awk -F ":" '{print $3}' /etc/passwd | sort | uniq -d); [[ -z "$duid" ]] && echo "NONE" || echo "$duid"
(vypíše duplicitní UID v systému)
# pp=$(awk -F ":" '{if (length($2) > 2) print $1}' /etc/passwd); [[ -z "$pp" ]] && echo "NONE" || echo "$pp" | tr " " "\n"
(vypíše uživatele, jejichž hesla se nachází v /etc/passwd)
if <podminka=pravda>; then <akce>; (elif <podminka2=pravda>; then <akce2>;) (else <akce3>); fi if uvádí podmínku, je-li pravdou, pak then specifikuje požadovanou akci, jinak else určí akci alternativní, další podmínky lze stanovit výrazem elif, seznam podmínek ukončuje fi
$ if test -f *.txt / [ -f *.txt ]; then echo "soubor existuje"; fi
$ if [ "$(whoami)" != 'root' ]; then exit; else echo "hello"; fi
$ if [ $? -ne 0 ]; then echo $?; fi
(příkaz vrátí kód 0, skončil-li předchozí příkaz neúspěšně)
# np=$(awk -F ":" '{if (length($2) > 2 && $2 !~ /^(!!)?(\$[1256]\$)/) print $1}' /etc/shadow); if [[ -z "$np" ]]; then echo "Všechna hesla jsou šifrovaná."; else { echo "Heslo je pravděpodobně nešifrované nebo nesprávné pro uživatele:"; echo "$np" | tr " " "\n";}; fi
(vypíše uživatele s nešifrovanými či nesprávnými hesly)
case <retezec> in <vzorek>(|<vzorek>) <seznam>;; esac vykoná příkaz na základě shody řetězce se vzorkem; řetězec ztotožňuje libovolnou proměnnou, vzorek „*“ uvádí akci, pokud shoda nenastane (obdoba příkazu „else“), seznam vzorků ukončuje „)“ a skupina příkazů se zakončí „;;“
#!/bin/bash
# Skript podle akce vytvoří či smaže daný soubor.
echo -n 'Zadej akci a soubor: '
read AKCE SOUBOR
case $AKCE in
     smaz|remove|delete) rm $SOUBOR;;
     vytvor|create)      touch $SOUBOR
                                             chmod 777 $SOUBOR;;
     *)                  echo 'Neznama operace';;
esac
read <slovo> čte řádek ze STDIN, rozdělí ho na slova a ta postupně přiřadí zadaným proměnným k dalšímu zpracování, -n <pocet_znaku> čte pouze daný počet znaků, -r ruší znaku „\“ speciální význam, -s nezobrazí dané znaky
#!/bin/bash
# Skript vyzve uživatele k zadání jména a hesla a potvrdí jeho
# převzetí.
echo -n "Jmeno: "; read jmeno
echo -n "Heslo: "; read -s heslo
echo " "
echo "Heslo pro $jmeno zadano."

$ cat test | { read a; read b; read c; echo "$a/$b/$c";}
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=0
while [ $i -lt 4 ]; do xterm &
     i=$[$i+1]; done

#!/bin/bash
# Skript vytváří soubor v intervalu pěti minut.
while true; do
     touch pic-`date|awk '{print $2,$3,$4,$6}'|sed 's/ /_/g'`.jpg
     sleep 300; 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=-1
until [ $a -eq 99 ]; do
     a=$(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ší třiceti dní.
while true; do
     DISKFUL=$(df -h $WEBDIR | grep -v File | \
     awk '{print $5 }' | cut -d "%" -f1 -)

     until [ $DISKFUL -ge "90" ]; do
          WEBDIR=/var/www/webcam
          DATE=`date +%Y%m%d`
          HOUR=`date +%H`
          mkdir $WEBDIR/"$DATE"

               while [ $HOUR -ne "00" ]; do
               PICDIR=/home/user/pics
               DESTDIR=$WEBDIR/"$DATE"/"$HOUR"
               mkdir "$DESTDIR"
               cp $PICDIR/*.jpg "$DESTDIR"/
               sleep 3600
               HOUR=`date +%H`; done

     DISKFULL=$(df -h $WEBDIR | grep -v File | \
     awk '{ print $5 }' | cut -d "%" -f1 -)
     done

TOREMOVE=$(find $WEBDIR -type d -mtime +30)
     for i in $TOREMOVE; do
     rm -rf "$i"; done
done
for <promenna> (in <retezec>); do <seznam>; done přiřadí proměnné postupně hodnotu všech parametrů skriptu či daného řetězce a vykoná seznam příkazů
#!/bin/bash
# Skript vytvoří uživatele uvedené v souboru "users" v pracovním
# adresáři, přidá je do skupiny "admins" a nastaví heslo
# "password".
for user in $(cat users); do
     useradd -g admins $user
     echo password | passwd --stdin $user
done

#!/bin/bash
# Skript vypíše obsah pracovního adresáře.
for x in $(ls -F)
do
     echo "V adresari `pwd` se nachazi soubor/adresar: $x"
done

#!/bin/bash
# Skript spočítá počet položek v pracovním adresáři.
POC=0
for nazev in *
     do
          POC=$(($POC+1))
     done
echo "V adresari `pwd` je $POC polozek."

#!/bin/bash
# Skript změní formát všech souborů .tif na .jpg.
for pic in *.tif; do
     convert "$pic" "$(echo "$pic" | sed 's/\.tif/.jpg/')"
done

#!/bin/bash
# Skript zjistí, který z uvedených procesů běží, vypíše jeho
# jméno včetně počtu řádků, které zabírá a nakonec zobrazí výpis
# všech procesů a celkový počet řádků.
services="http pmon lsnr sap"
for service in $services
     do running_processes="$(ps -ef | grep $service | grep -v grep)"
          if [ -n "$running_processes" ]
               then echo
               echo $service:
               echo
               echo "$running_processes"
               echo
               echo "lines: $(echo "$running_processes" | wc -l)"
               echo
               echo "=========="
          fi
     done
echo
echo "summary:"
echo
ps -ef
echo
echo "lines: $(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říkaz
# "hostname" a "uname -a" a výsledek pak zobrazí na STDOUT.
# Podmínkou takového připojení jsou funkční autentizační
# rsa / dsa klíče pro ssh.
for a in $(cat servers); do
ssh $a 'hostname; uname -a'; done
break (<n>) ukončí daný cyklus, n určí počet cyklů
#!/bin/bash
# Skript se ukončí, pokud hodnota proměnné se rovná 3.
for myloop in 1 2 3 4 5; do
     echo "$myloop"
     if [ "$myloop" -eq 3 ]; then
     break # This line will break out of the loop; fi
done
continue (<n>) opakuje další cyklus, n určí počet cyklů
#!/bin/bash
# Skript povolí v názvech souborů jen malá písmena.
LIST="$(ls)"
for name in "$LIST"; do
     if [[ "$name" != *[[:upper:]]* ]]; then
     continue; fi

ORIG="$name"
NEW=$(echo $name | tr 'A-Z' 'a-z')
mv "$ORIG" "$NEW"
echo "new name for $ORIG is $NEW"
done
exit (<n>) ukončí skript daným návratovým kódem, není-li uveden, bere se v úvahu návratový kód posledního příkazu uvnitř skriptu


FUNKCE
function <jmeno_funkce> { <seznam>;} / <jmeno_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 předaných argumentech 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 až 9, „${<n>}“ libovolný argument v pořadí, „$*“ všechny argumenty)
# Funkce „test“ vytvoří soubor, který je zadán jako argument a
# nastaví mu daná 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áška.

$ function test
> {
> if ! [ -e $* || $* = '' ]; then
>     touch $*; chmod 755 $*
> else
>     echo "Error"
> fi
> echo "Počet argumentů: $#"
> echo "Všechny argumenty: $*"
> echo "Pátý argument: $5"
> }

# Funkce „user“ zjistí, zda uživatel, který je zadán jako
# argument, existuje v systému, a pokud ano, vypíše o něm podrobné
# informace.

$ user ()
> {
> if [ $(grep -ic ^$1 /etc/passwd) -eq 0 ]; then
>     echo "Uzivatel $1 neexistuje."
> else
>     echo "Uzivatel $1 existuje." && finger $1
> fi
> }

# Funkce „poc“ vypočítá procentuální hodnotu druhého číselného
# argumentu z prvního, přičemž první argument představuje hodnotu
# 100%.

$ poc () {
> local x=$1 y=$2
> echo "$x = 100%, $y = x%"
> echo "$y = $[$(( 100 * $y )) / $x]% z $x"
> }
return (<n>) ukončí funkci daným návratovým kódem, není-li uveden, bere se v úvahu návratový kód posledního provedeného příkazu uvnitř funkce
Poslední úprava: 2017/02/14 21:54 autor: Miroslav Bernát

Nástroje pro stránku

počet návštěv: