Proměnné a parametry predn_08.odt 16.04.2007 14:00:38 1
Proměnné a parametry Jméno proměnné - identifikátor [a-za-z_][a-za-z_0-9]* Hodnota proměnné textový řetězec celočíselná hodnota - ne v sh Přesun proměnné do prostředí procesu export proměnná export proměnná=hodnota # ne v sh Pozor! u sh je třeba export opakovat po každé změně proměnné!! predn_08.odt 16.04.2007 14:00:38 2
Speciální proměnné shellu $0 jméno scriptu $1,...$9,${10}... parametry scriptu $* $1 $2 $3... $@ $1 $2 $3... "$*" "$1 $2 $3..." "$@" "$1" "$2" "$3"... $# počet parametrů $? návratový kód $- přepínače shellu $$ číslo aktivního procesu (PID) $! číslo procesu spuštěného na pozadí predn_08.odt 16.04.2007 14:00:38 3
Předdefinované proměnné shellu HOME IFS MAIL PATH PS1 PS2 ENV TMOUT SHELL domovský adresář oddělovač parametrů mailbox cesta k programům hlavní prompt pokračovací prompt jméno inicializačního souboru prodleva automatického odhlášení pokud není zadán příkaz cesta k interpetu příkazů predn_08.odt 16.04.2007 14:00:38 4
Nastavení hodnoty proměnné Přiřazovacím příkazem proměnná=hodnota Příklad: $ p1=abc $ p2=3 $ p3="a b c" $ p4=`date` $ p5=$(date) # jen ksh Načtením ze vstupu read seznam_proměnných Příklad: (vstup je a b c) $ read p1 # p1="a b c" $ read p1 p2 # p1=a p2="b c" $ read p1 p2 p3 # p1=a p2=b p3=c $ read p1 p2 p3 p4 # p1=a p2=b p3=c p4="" predn_08.odt 16.04.2007 14:00:38 5
Volání skriptu nebo funkce Nastavení hodnot parametrů Parametry ($1,..., $#) se nastavují při volání skriptu nebo funkce na hodnoty uvedené na příkazové řádce. Příkaz set set -- seznam_parametrů Rozdělení seznamu podle $IFS a přiřazení hodnoty do $1, $2,... Příklad: $ set -- a b c $ echo "\$1=$1, \$2=$2, \$3=$3" $1=a, $2=b, $3=c predn_08.odt 16.04.2007 14:00:38 6
Příkaz shift shift n shift # n=1 Posun hodnot parametrů vlevo - $1=$<1+n>, $2=$<2+n>,..., $#=$# - <n> Příkaz xargs xargs příkaz přepínače Volání příkazu s parametry zadanými na standardním vstupu. Příklad: $ find. xargs ls -ld drwxr-xr-x 3 honza staff 512 Nov 3 20:28. drwxr-xr-x 2 honza staff 512 Nov 5 12:50./awk -rwxr-xr-x 1 honza staff 226 Nov 5 12:53./awk/hanoi -rwxr-xr-x 1 honza staff 92 Nov 3 22:04./awk/t $??? V čem je rozdíl proti volání: find. -exec ls -ld {} \; predn_08.odt 16.04.2007 14:00:38 7
Příkaz getopts getopts definice_přepínačů proměnná Vyhledá první resp. další přepínač na příkazové řádce. Je-li obsažen v definici, nastaví ho do proměnné proměnná Je-li v definici následován dvojtečkou, přesune následující parametr do OPTARG V OPTIND shell udržuje číslo parametru (voláním shelluse nastaví OPTIND=1) Není-li přepínač nalezen v definici, je proměnná nastavena na hodnotu?. Začíná-li definice dvojtečkou, není hlášena chyba a neznámý přepínač je přesunut do OPTARG. V opačném případě je hlášena chyba a OPTARG není nastaveno. Příkaz getopts se obvykle volá v cyklu while. predn_08.odt 16.04.2007 14:00:38 8
Příklad: $ cat getopts.sh #!/bin/ksh if [ $# -eq 0 ]; then echo "volani $0 [+-]x [+-]y hodnota" exit 1 fi while getopts :xy: opt ; do case $opt in x) print "prepinac je: -x" ;; +x) print "prepinac je: +x" ;; y) print "parametr je: -y, hodnota je: $OPTARG" ;; +y) print "prepinac je: +y, hodnota je: $OPTARG" ;; \?) print "$OPTARG neni platna volba" ;; esac done $./getopts.sh -x +x -y yyy +y zzz -q prepinac je: -x prepinac je: +x parametr je: -y, hodnota je: yyy prepinac je: +y, hodnota je: zzz q neni platna volba predn_08.odt 16.04.2007 14:00:38 9
Hodnoty proměnných $proměnná ${proměnná} ${prom:-text} ${prom:=text} ${prom:?text} je-li $prom prázdné - vrací text jinak $prom je-li $prom prázdné, prom=text, vrací $prom je-li $prom prázdné, výpíše text a končí (exit) Zobrazení hodnot proměnných set výpis všech proměnných a jejich hodnot (včetně proměnných prostředí) env výpis pouze proměnných prostředí a jejich hodnot echo výpis argumentů print výpis argumentů - ne v sh predn_08.odt 16.04.2007 14:00:38 10
Příkaz echo echo seznam_argumentů Výpis argumentů oddělených mezerou Uvnitř " " lze použít: \b BS \c nedoplnit NL \f FF \n NL \r CR \t tab \\ \ Příkaz print - ne v sh print přepínače seznam_argumentů Jako echo, zabudovaný příkaz shellu Přepínače: -n nedoplnit NL predn_08.odt 16.04.2007 14:00:38 11
Práce s textovými řetězci Příkazy basename a dirname basename řetězec vrací část řetězce za posledním lomítkem dirname řetězec vrací vše z řetězce kromě posledního lomítka a textu za ním Příklad: $ echo "Dir=`dirname a/b`, Base=`basename a/b`" Dir=a, Base=b Příkaz printf printf format seznam_parametru Výpis hodnot podle zadaného formátu (viz awk resp. nawk) Příklad: $ A=a; I=1 $ printf "A=%-3s I=%3i\n" "$A" "$I" A=a I= 1 predn_08.odt 16.04.2007 14:00:38 12
Příkaz tput Vyzvednutí řetězce na provedení nějaké akce s terminálem z terminfo databáze. tput vlastnost_z_terminfo Příklad $ tput clear #vymaz obrazovky $ tput init #inicializace terminalu $ bold=`tput smso` $ offbold=`tput rmso` $ echo "Please type in your ${bold}name: ${offbold}\c" Please type in your name: $ predn_08.odt 16.04.2007 14:00:38 13
Práce s textovými řetězci - jen ksh ${prom#vzor} ${prom##vzor} ${prom%vzor} ${prom%%vzor} Příklad: $ p1="/a/b/c" $ echo ${p1#*/} a/b/c $ echo ${p1##*/} c $ echo ${p1%/*} /a/b $ echo ${p1%%/*} řetězec následující za 1. výskytem vzoru za posledním výskytem vzoru řetězec předcházející poslednímu výskytu vzoru prvnímu výskytu vzoru $ predn_08.odt 16.04.2007 14:00:38 14
Konstanty a celočíselné proměnné - jen ksh Definice konstanty typeset -r proměnná[=hodnota] V ksh je implicitně nadefinován alias readonly="typeset -r" lze proto také psát readonly proměnná[=hodnota] Přiřazení do konstanty způsobí chybu Definice celočíselné proměnné typeset -i proměnná[=číselná_hodnota] V ksh je implicitně nadefinován alias integer="typeset -i" lze proto také psát integer proměnná=číselná_hodnota Přiřazení textového řetězce do celočíselné proměnné způsobí chybu predn_08.odt 16.04.2007 14:00:38 15
Nastavení báze pro výpis - jen ksh Bázi pro výpis proměnné příkazy print a echo lze nastavit příkazem v rozsahu 2.. 32: typeset -i<báze> proměnná Příklad: $ integer p1=10 $ echo $p1 10 $ typeset -i8 p1 $ echo $p1 8#12 $ typeset -i2 p1 $ echo $p1 2#1010 $ predn_08.odt 16.04.2007 14:00:38 16
Celočíselná aritmetika v sh Příkaz expr Zašle na standardní výstup vyhodnocení výrazu uvedeného jako argumenty. Argumenty (operandy a operátory) musí býtodděleny alespoň 1 mezerou, pozor na kolizi s metaznaky shelu. Výrazy se vyhodnocují podle priorit (dále uvedeny se vzrůstající prioritou), výrazy se stejnou prioritou se vyhodnocují zleva (uvedeny ve složených závorkách): v1 \ v2 v1, je-li různé od 0 resp.prázdnéhořetězu (""), jinak v2 v1 \& v2 v1, jsou-li v1 i v2 různé od 0 resp. "", jinak 0 v1 {=,\>,\>=,\<,\<=,!=} v2 vrací 1, je-li relace (číselná nebo řetězová) splněna, jinak 0 v1 {+,-} v2 v1 {\*,/,%} v2 v1 : regexp sčítání nebo odčítání násobení, dělení, zbytek po dělení délka srovnání regexp s v1 predn_08.odt 16.04.2007 14:00:38 17
Příklad: $I=`expr $I + 1` let proměnná=výraz nebo ((proměnná=výraz)) Celočíselná aritmetika - ksh Operandy a operátory ve výrazu se nemusí oddělovat mezerou. Nehrozí kolize s metaznaky shellu. Proměnné ve výrazu se automaticky nahrazují hodnotou (netřeba používat $) Operátory : +, -, *, /, ( ) % modulo # base <<, >> bitové posuny vlevo a vpravo &,, ^ bitové and, or, xor predn_08.odt 16.04.2007 14:00:38 18
Pole - jen ksh - jednorozměrná - index je číslo nebo celočíselná proměnná (bez $), rozsah 0-4095 Přiřazení hodnoty: proměnná[index]=hodnota Hodnota položky: ${proměnná[index]} Hodnota všech položek ${proměnná[*]} Počet použitých položek ${#proměnná[*]} predn_08.odt 16.04.2007 14:00:38 19