180 likes | 343 Views
Shell jako programovací jazyk. $ karel=47163225 $ echo $karel 4716225 $. Proměnné znakové řetězce (mimo znak $, mezera, TAB ), lze přiřadit $ jm éno=hodnota před a za lomítkem nesmí být mezera, k získání hodnoty slouží operátor $. $ karel=“12345 ahoj 2356” $ echo $karel
E N D
Shell jako programovací jazyk $ karel=47163225 $ echo $karel 4716225 $ Proměnné znakové řetězce (mimo znak $, mezera, TAB), lze přiřadit $ jméno=hodnota před a za lomítkem nesmí být mezera, k získání hodnoty slouží operátor $. $ karel=“12345 ahoj 2356” $ echo $karel 12345 ahoj 2356 $ pepa=$karel $ echo $pepa 12345 ahoj 2356 $ Proměnné pokud proměnná obsahuje mezeru, musí být řetězec uzavřen do uvozovek. Do jedné proměnné lze uložit i obsah jiné proměnné. Obsah jednotlivých proměnných se mohou sčítat jako řetězce. $ a=Ah $ b=oj $ c=Karle. $ slovo=“$a$b $c” $ echo $slovo Ahoj Karle. $
Shell jako programovací jazyk Znak $ si ponechává i v uvozovkách svůj speciální význam. Pro potlačení je potřeba řetězec uzavřít mezi uvozovky nebo znaku $ musí předcházet znak \. Do proměnné lze uložit dlouhé řetězce, se kterými se pracuje. $ cesta=/usr/people/students/ytesta00 $ cat $cesta/soubor.ls $ výpis souboru bez zadávání adresáře $ karel=‘$$$ ahoj 2356’ $ echo $karel $$$ ahoj 2356 $ karel=“\$\$\$ ahoj 2356” $ echo $karel $$$ ahoj 2356 $ Kromě proměnných definovaných uživatelem používá shell také některé speciální proměnné, v nichž jsou uloženy informace o prostředí, ve kterém shell pracuje. Výpis těchto proměnných se zobrazí příkazem env. Pro zobrazení všech proměnných, které jsou definované - příkaz set.
Shell jako programovací jazyk $env _=/sbin/env LANG=en_CZ HZ=100 PATH=/usr/sbin:/usr/bsd:/sbin:/usr/bin:/usr/bin/X11: NOMSGLABEL=1 REMOTEUSER=UNKNOWN LOGNAME=vdumek MAIL=/usr/mail/vdumek USER=vdumek MSGVERB=text:action DISPLAY=A4705C.fme.vutbr.cz:0 SHELL=/bin/ksh REMOTEHOST=A4705C.fme.vutbr.cz HOME=/usr/people/vdumek TERM=vt100 PWD=/usr/people/vdumek TZ=CET-1CEST,M3.5.0/2,M10.5.0/3 NOMSGSEVERITY=1
Shell jako programovací jazyk $set DISPLAY=A4705C.fme.vutbr.cz:0 ERRNO=10 FCEDIT=/bin/ed HOME=/usr/people/vdumek HZ=100 IFS='' LANG=en_CZ LINENO=1 LOGNAME=vdumek MAIL=/usr/mail/vdumek MAILCHECK=600 MSGVERB=text:action NOMSGLABEL=1 NOMSGSEVERITY=1 OPTARG OPTIND=1 PATH=/usr/sbin:/usr/bsd:/sbin:/usr/bin:/usr/bin/X11: pokračování
Shell jako programovací jazyk PPID=29836 PS1='$ ' PS2='> ' PS3='#? ' PS4='+ ' PWD=/usr/people/vdumek RANDOM=6170 REMOTEHOST=A4705C.fme.vutbr.cz REMOTEUSER=UNKNOWN SECONDS=946 SHELL=/bin/ksh TERM=vt100 TMOUT=0 TZ=CET-1CEST,M3.5.0/2,M10.5.0/3 USER=vdumek _=set karel='ahoj $karle' pokračování
Shell jako programovací jazyk Význam proměnných env _ poslední zadávaný řetězec LANG jazykové prostředí HZ PATH prohledávaná cesta NOMSGLABEL REMOTEUSER charakteristika uživatele (X Win) LOGNAME přihlášený uživatel MAIL adresář pro poštu USER přihlášený uživatel MSGVERB DISPLAY lokalita přihlášeného terminálu (XW) SHELL explicitní shell uživatele REMOTEHOST lokalita přihlášeného terminálu (XW) HOME domácí adresář TERM emulovaný terminál PWD proměnná s aktuálním adresářem TZ nastavení časové zóny NOMSGSEVERITY
Shell jako programovací jazyk Význam proměnných set DISPLAY lokalita přihlášeného terminálu ERRNO proměnná s návratovou hodnotou FCEDIT implicitní editor (ed) HOME domovský adresář uživatele HZ IFS interní oddělovače polí (SPACE, TAB) LANG jazykové prostředí LINENO počáteční řádek prováděného scriptu LOGNAME přihlášený uživatel MAIL adresář pro poštu MAILCHECK interval kontroly došlé pošty MSGVERB NOMSGLABEL NOMSGSEVERITY OPTARG hodnota posledního argumentu ... OPTIND index posledního argumentu ... PATH prohledávaná cesta PPID číslo rodičovského procesu shellu PS1 hodnota primárního promptu PS2 hodnota sekundárního promptu PS3 prompt třetí úrovně PS4 prompt čtvrté úrovně PWD proměnná s hodnotou aktuálního adresáře RANDOM inicializační hodnota generátoru náhodných čísel (0 - 32767) pokračování
Shell jako programovací jazyk pokračování Význam proměnných set REMOTEHOST lokalizace terminálu REMOTEUSER identifikace uživatele pro X-Windows SECONDS délka přihlášení v sekundách SHELL standardní shell TERM emulovaný terminál TMOUT sekundy pro zadání příkazu TZ časová zóna USER přihlášený uživatel _ poslední zadaný příkaz karel proměnná definovaná uživatelem Pro oznámení aktuálního adresáře tvarem promptu: $ PS1=‘$PWD> ‘ /usr/people/vdumek> Pro nastavení vlastností shellu se používá: set -o ….. (+ přepíná do off, - do on) set -o vi - procházení příkazy
Shell jako programovací jazyk noclobber off noglob off nolog off nounset off notify off privileged off restricted off trackall off verbose off vi off viraw off xtrace off allexport off bgnice on emacs off errexit off gmacs off ignoreeof off interactive on keyword off markdirs off monitor on noexec off
Shell jako programovací jazyk Proměnné Pro individuální nastavení tvaru promptu patřičné úrovně lze změnit hodnotu proměnné PS1, PS2, … Pokud není jistota o hodnotě proměnné, vypíše se pomocí příkazu echo. Pokud se vrací prázdný řetězec, nemá proměnná definovanou hodnotu. $ PS1=“Zde# “ Zde# uvozovky - mezera mezi promptem a příkazem Přiřazení výstupu příkazu do proměnné Složitému opisování výstupu jednoho příkazu z obrazovky na klávesnici se lze vyhnout pomocí operátoru ` (obrácený apostrof). Příkaz uzavřený mezi obrácené apostrofy je na příkazovém řádku nahražen svým výstupem. $ pwd /usr/share/catman/u_man/cat1/Xm $ adr=`pwd` $ echo adr /usr/share/catman/u_man/cat1/Xm $
Shell jako programovací jazyk Scénář (script) Všechny zadávané příkazy mohou být uloženy v souboru, kterému se říká script. Příkazy jsou v něm odděleny středníkem nebo novým řádkem. Při spuštění shellu se jménem scriptu jako argumentem - shell přesměruje na svůj standardní vstup příkazy ze scénáře a postupně je vykonává. $ cat ad echo -n “Aktualni adresar je “ pwd $ sh ad Aktualni adresar je /usr/people/vdumek $
Shell jako programovací jazyk Příkaz echo -n je stejný jako příkaz echo, přechází však automaticky na nový řádek. Scénáře není potřeba spouštět jen jako argumenty shellu, mohou se u nich změnit přístupová práva a spouštět je přímo jako příkaz. $ chmod +x ad $ ad Aktualni adresar je /usr/people/vdumek $ Ve scénáři se mohou vyskytovat i proměnné, které si zachovávají hodnotu jen během běhu scénáře. Při ukončení běhu scénáře přestávají být proměnné definovány. Stejně tak proměnné definované mimo scénář neovlivní proměnné ve scénáři se stejným identifikátorem. Každý scénář je spuštěn jinou kopií shellu a jeho proměnné mají platnost jen v této kopii. $ cat ad2 adr=`pwd` echo “Aktualni adresar je $adr” $ sh ad2 Aktualni adresar je /usr/people/vdumek $ echo adr $
Shell jako programovací jazyk Pokud je potřeba předat proměnnou do scénářů spouštěným na nižší úrovni, musí se tyto vyexportovat $ export jméno_proměnné Po zadání příkazu pro export proměnné je možné používat ve všech podřízených kopiích shellu (a ve všech scénářích v nich spouštěných) tyto proměnné. Jejich hodnota je taková, jakou měly před příkazem export. Ve scénářích je výhodné používat komentáře, zajistí se lepší srozumitelnost a přehlednost. Pro shell je komentář vše, co se nachází mezi znakem # a koncem řádku. Pokud je potřeba použít ve scénáři znak #, je potřeba před něj napsat znak \, který ruší speciální význam znaků.
Shell jako programovací jazyk Argumenty scriptu - poziční parametry Poziční parametr je vnitřní proměnná shellu $i, kde i je pořadí argumentu na příkazové řádce. Vlastní jméno scénáře má číslo 0. Počet pozičních parametrů je omezen na 9 (shell vyhodnocuje jako index parametru jen jednu číslici za operátorem $). Proměnná $* zastupuje množinu všech argumentů scénáře. Počet pozičních parametrů udává proměnná $#. Speciální proměnné shellu $i poziční parametr i $# počet parametrů $* všechny parametry $ cat long ls -la $1 $ chmod +x long $ long `pwd` … výpis aktuálního adresáře ... $ $ cat long ls -la $1 $ sh long /usr/people/vdumek … výpis zadaného adresáře ... $
Shell jako programovací jazyk $ cat cti echo "Pocet parametru: $#" echo "Precetl jsem: $*” $ cti 1 2 3 4 5 6 7 8 9 10 11 12 13 Pocet parametru: 13 Precetl jsem: 1 2 3 4 5 6 7 8 9 10 11 12 13 $ $ cat shi echo ”$*” shift shift echo "$8 $9” $ shi 1 2 3 4 5 6 7 8 \ 9 10 11 1 2 3 4 5 6 7 8 9 10 11 $ 10 11 Pokud je potřeba zpracovat více jak 9 pozičních parametrů, musíme zajistit posuv těchto parametrů pomocí příkazu shift. Potom je možné se odvolat na další parametr a hodnota prvního je zapomenuta. V případě potřeby přistupovat i k takto odloženým parametrům, musíme jejich hodnotu uchovat v pomocných proměnných.
Shell jako programovací jazyk $ cat posuv echo "Pocet parametru: $#" echo "Precetl jsem: $*” pos1=$1; pos2=$2 shift; shift echo “1. zapomenuty: $pos1” echo “2. zapomenuty: $pos2” echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $ posuv 1 2 3 4 5 6 7 8 9 10 11 12 13 Pocet parametru: 13 1. zapomenuty: 1 2. zapomenuty: 2 3 4 5 6 7 8 9 10 11 $
Shell jako programovací jazyk Pokud hodnotu proměnné potřebujeme zadat až v průběhu provádění scriptu, použijeme příkaz read. $ cat kde # script vyhleda terminal zadaneho uzivatele echo ”Zadej jmeno uzivatele: ” read jmeno who | grep $jmeno $ kde Zadej jmeno uzivatele: vdumek vdumek ttyq0 Mar 22 22:54 $
Shell jako programovací jazyk $ cat pridej echo ”Novy soubor: " read soubor echo ”Pridavany soubor: " read soubor1 vi $soubor << KONEC :r $soubor1 :wq KONEC $ Here document Konstrukce umožňuje zapsat data, která mají sloužit jako vstup příkazu, přímo do scriptu. Není potřeba vytvářet pro data zvláštní soubor a předávat je ke zpracování pomocí přesměrování standardního vstupu. Obecný formát konstrukce: příkaz << koncový_řetězec … vstupní řádky … koncový_řetězec příkaz je libovolný příkaz, kterému jsou určeny vstupní řádky, koncový_řetězec oznamuje shellu, kde končí vstup pro příkaz. Shell čte postupně jednotlivé řádky a předává je na standardní vstup příkazu. Po přečtení koncového řetězce je uzavřen standardní vstup příkazu a ostatní řádky jsou interpretovány obvyklým způsobem. Koncový řetězec je zpracován standardním způsobem, pokud obsahuje speciální znaky, musí být uzavřen do ‘’, nebo musí být tyto znaky opatřeny prefixem \.