Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Úvod do UNIXu (6 th round) David Hoksza a Jakub Galgonek

Podobné prezentace


Prezentace na téma: "Úvod do UNIXu (6 th round) David Hoksza a Jakub Galgonek"— Transkript prezentace:

1 Úvod do UNIXu (6 th round) David Hoksza a Jakub Galgonek

2 Substituce příkazu `cmd args`, $(cmd args)  var=`find. –name “*.php”`  var=`find. –name “*.php” | wc -l`  echo $var běží v subshellu

3 Návratové hodnoty Úspěch  0 Neúspěch  > 0  záleží na programu, jak definuje chybové návratové kódy exit [N]  ukončí provádění skriptu a vrátí rodičovskému procesu návratovou hodnotu N  defaultně vrací 0

4 Řídící struktury (1) for var in list; do commands [break] [continue] done list se uvažuje jako seznam slov a ne seznam řádků!!!! break  ukončení provádění cyklu continue  ukončení provádění dané iterace a skok na další středník za list je požadován při zápisu do na stejný řádek výstup cyklu lze přesměrovat for var in file1 file2 file3; do cp $var $var.bak done for var in *; … for i in ; do echo $i done | wc –l for i in `seq 1 4`; …

5 read načtení řádky ze vstupu do proměnné  echo “Write string: “; read x; echo $x  read –p “Write string: “ x; echo $x proměnná IFS určuje separátor polí do poslední proměnné se ukládá zbytek řádky lze přesměrovávat  read user_record < /etc/passwd

6 Řídící struktury (2) while command; do commands [break] [continue] done dokud je návratová hodnota příkazu 0 break  ukončení provádění cyklu continue  ukončení provádění dané iterace a skok na další středník za command je požadován při zápisu do na stejný řádek při přesměrování souboru do while pomocí roury běží while v subshellu  neplatí to při přesměrování vstupu do cyklu na konci cyklu pomocí < while read line; do echo “You wrote: “ $line; #ukonceni skriptu Ctrl+c done cat /etc/passwd | while read line … while : ; do … done

7 Řídící struktury (3) if command; then commands [elif list commands ] [else commands] fi if mkdir "$1" 2>/dev/null; then echo "Directory $1 created“ else echo "Directory $1 probably exists" fi if mkdir "$1" 2>/dev/null; then echo "Directory $1 created" elif test -d $1 ; then #elif [ -d $1 ] ; then echo " Directory $1 already exists" else echo "Directory $1 not created" fi

8 test (1) shell umí v podmínkách porovávat pouze návratové hodnoty programů test condition, [ condition ]  mezery jsou u [ ] důležité!  -f file … zda soubor file existuje test -f filename; echo $?; [ -f filename ]; echo $?  -d dir … zda je dir adresář  -L file … zda je file symlink  -r file … zda má uživatel na file právo r  -w file … zda má uživatel na file právo w  -x file … zda má uživatel na file právo x  -z str … zda je str prázdný (zero)  -n str … zda je str neprázdný (nonzero)  str1 = str2 … zda se řetězec str1 rovná str2  str1 != str2 … zda se řetězec str1 nerovná str2

9 test (2)  num1 -eq num2 … zda se číslo num1 rovná num2  -ne, -lt, -le, -gt, -ge … nerovná (not equal), je menší (less than), je menší nebo rovno (less or equal), je větší (greater than), je větší nebo rovno (greater or equal) podmínky lze kombinovat condition1 –a condition2  and condition1 –o condition2  or !condition  negace ( condition )  priorita operací  [ 1 -le 2 -o \( 2 -le 1 -a 0 -ne 0 \) ]; echo $?  [ \( 1 -le 2 -o 2 -le 1 \) -a 0 -ne 0 ]; echo $?

10 expr shell pracuje s řetězci (nemá zabudovanou aritmetiku) expr arg1 op arg2  vyhodnotí a výsledek dá na výstup stejně jako návratovou hodnotu  +, -, *, /, %,  =,, =, != pozor na speciální význam znaků expr 1 \< 2; expr 1 “<“ 2 aritmetiku a porovnání lze také zavést použitím konstruktu $(( ))  echo $(( 100 * 200 / 10 ))

11 Řídící struktury (4) case str in vzor1) commands;; vzor2| vzor3) commands;; *) commands;; esac ;; zde vyjadřuje ukončení bloku! case $1 in a) a_param=1;; x|y) x_param=1; y_param=1;; *) no_params=1;; esac;

12 funkce [function] func_name () { … return N; } argumenty jsou přístupné přes čísla ($1, $2, …) volání funkce je stejné jako volání programů běží v aktuálním shellu fce() { var1=$1; return `expr $1 + 1` } var1=4 fce 10 echo $? echo $var1

13 eval dvounásobné vyhodnocení vstupu eval command  pipe="|" ; eval ls $pipe wc -l  var=abcd  eval $var=efgh  echo $var; echo $abcd;  eval echo \$$#

14 Další příkazy date  vypíše aktuální čas  používá se při logování alias str = ‘command’  vytvoří alias str, tj. příkaz str nyní reprezentuje command  zapisuje se do.bashrc (nebo jiných skriptů pouštěných při startu shellu), stejně jako ostatní příkazy, které se mají vykonat při nalogování

15 Příklady (1) Mějme tel. seznam v souboru. Skript pro vložení záznamu: echo "$1 $2" >> tel_sez; Odebrání z tel. seznamused "/^$1/ d" tel_sez > tel_sez~ && ( mv tel_sez~ tel_sez || rm tel_sez~ ) Skript pro zálohu souborů přidáním ~ a případným odebráním předem, pokud soubor existuje. for f in *; do if [ -f $f~ ] ; then rm $f~; fi ; cp $f $f~ ; done Program, který bude při mazání logovat, kdo a kdy provedl rm rm $1 && echo "`date` - $USER : $1" >> ~/remove.log Skript pro vypsání řádek souborů v aktuálním adresáři, prefixovaných jejich číslem. for filename in *; do linecount="1" while read line ; do echo "${linecount}: $line" linecount="$(( $linecount + 1 ))" done < $filename done

16 Příklady (2) Skript pro vypsání počtu spustitelných souborů v PATH a HOME declare -i count count=0; tempPath=`echo "$PATH:$HOME" | sed -e "s/ /~~/g" -e "s/:/ /g"` echo $tempPath; for dir in $tempPath ; do dir=`echo $dir | sed "s/~~/ /g"` if [ -d "$dir" ] ; then for file in `ls $dir` ; do if [ -x "$dir/$file" ] ; then count=$count+1 else nocount=$((nocount+1)); fi done fi done echo "Binaries count: " $count ", Others: " $nocount

17 awk Aho, Weinberg, Kernighan filtrování vstupního textu po řádcích + práce se sloupci vyhledávání podle regulárních výrazů vlastní programovací jazyk podobný C awk > nawk – 1985 (Sun OS) -> gawk (POSIX) 1992

18 awk – základní syntaxe awk ‘script’ files  script je libovolný počet posloupností /pattern/ { actions } bez pattern se actions vztahují na všechny řádky  sloupce odděleny znaky z IFS (tj. defaultně mezera, tabulátor)  sloupce odkazovány pomocí $1, $2, … awk '{ print $1 $3 ; }' prices

19 awk - printf printf(fmt, args)  počet args je odvozen od fmt  fmt (formátovací řetězec) obsahuje text a dvojice %znak, kde za i-tý výskyt je nahrazen i-tý argument  % s … řetězec c … znak d … integer f … float  může obsahovat \n, \t, … printf(”Řetězec: %s\nInteger: %d”, $str, $i)

20 awk – porovnání value ~ /pattern/  zda hodnota value vyhovuje vzoru pattern value !~ /pattern/  nevyhovuje, =, ==, != awk ' $3 <= 75 { printf "%s\t%s\n",$0,”Malé množství" ; } $3 > 75 { print $0 ; } ' prices.txt #třetí sloupec je množství Lze skládat pomocí operátorů && (and) a || (or) awk ' ($2 ~ /^\$[1-9][0-9]*\.[0-9][0-9]$/) && ($3 < 75) { printf "%s\t%s\n",$ě,”Malé množství" ; } ' prices.txt #druhý sloupec je cena v dolarech

21 awk lze definovat akce prováděné na začátku a na konci skriptu awk ' BEGIN { actions } /pattern/ { actions } END { actions } ' files v inicializační sekci lze  inicializovat proměnné, které budou v průběu inkrementovány  nastavit FS (field separator) BEGIN { FS=":" ; } do skriptu lze předávat proměnné shellu awk ' $3 <= count { print ; } ' count="$count" prices.txt lze kombinovat s shellovým programováním  ls -l | awk '$1 !~ /total/ { printf "%-32s %s\n",$9,$5 ; }'

22 proměnné awk FILENAME  jméno zpracovávaného souboru NR  číslo právě zpracovávaného záznamu NF  počet polí právě zpracovávaného záznamu OFS  výstupní separátor polí (defaultně mezera) FS  vstupní separátor polí (defaultně mezera a tabulátor) ORS  výstupní separátor záznamů (defaultně nový řádek) RS  vstupní separátor záznamů (defaultně nový řádek) awk 'BEGIN { FS=":" ; } { print $1, $6 ; }' /etc/passwd

23 awk – tok programu awk umožňuje práci s while, for, if se stejnou syntaxí jako v C if (expression1) { action1 } else if (expression2) { action2 } else { action3 } if ($2 > 0 && $3 < 35) { print “xxx”; } else {print $1} while (expression) { actions } awk 'BEGIN { x=0 ; while (x < 5) { x+=1 ; print x ; } }' for (initialize_counter; test_counter; increment_counter) { action } awk '{ for (x=1;x<=NF;x+=1) { printf "%s ",$x ; } printf "\n" ; }' prices.txt


Stáhnout ppt "Úvod do UNIXu (6 th round) David Hoksza a Jakub Galgonek"

Podobné prezentace


Reklamy Google