Professional Documents
Culture Documents
Sistemes operatius
Sistemes operatius
ndex
Introducci ............................................................................................... Objectius ................................................................................................... 1. Intrprets dordres del sistema Unix. Shells de Bourne i de Bash ............................................................... 1.1. Traductors .................................................................................... 1.1.1. Programa informtic ........................................................ 1.1.2. Llenguatges de programaci ........................................... 1.1.3. Compiladors i intrprets .................................................. 1.1.4. Enlla i llibreries .............................................................. 1.1.5. Interfcies, crides al sistema i API .................................. 1.2. Intrprets dordres ...................................................................... 1.3. Els guions o els shell scripts ...................................................... 1.3.1. Fases en la gesti dels guions ......................................... 1.4. El shell de Bourne ....................................................................... 1.4.1. Histria del shell de Bourne ............................................ 1.4.2. Informaci general sobre el shell de Bourne ................ 1.4.3. Gesti de les variables en el shell de Bourne ................ 1.4.4. Acabar un shell de Bourne ............................................... 1.4.5. Estructures de control del shell de Bourne ................... 1.4.6. Expressions matemtiques del shell de Bourne ........... 1.4.7. Funcions del shell de Bourne .......................................... 1.4.8. Pas de parmetres i la seva gesti en els guions del shell de Bourne ........................................................... 1.4.9. Guions dinici i de final de sessi en el shell de Bourne .......................................................................... 1.4.10.Ordres de referncia del shell de Bourne ...................... 1.5. El shell de Bash ........................................................................... 1.5.1. Informaci general sobre el shell de Bash ..................... 1.5.2. Gesti de les variables en el shell de Bash .................... 1.5.3. Acabar un shell de Bash ................................................... 1.5.4. Estructures de control del shell de Bash ....................... 1.5.5. Expressions matemtiques del shell de Bash ............... 1.5.6. Arrays del shell de Bash ................................................... 1.5.7. Funcions del shell de Bash .............................................. 1.5.8. Pas de parmetres i la seva gesti en els guions del shell de Bash ............................................................... 1.5.9. Guions dinici i de final de sessi en el shell de Bash .. 1.5.10.Ordres de referncia del shell de Bash ..........................
5 7
8 8 8 9 10 11 12 12 15 16 18 18 19 23 28 29 39 40 44 47 47 48 49 50 55 55 58 61 62 64 65 66
Sistemes operatius
2. El shell de C i el shell de T ............................................................... 2.1. Els shells de C i de T ................................................................... 2.1.1. Informaci general sobre els shells de C i de T ............. 2.1.2. Gesti de les variables en els shells de C i de T ............ 2.1.3. Acabar un shell de C i un shell de T ................................ 2.1.4. Estructures de control en els shells de C i de T ............ 2.1.5. Expressions matemtiques en els shells de C i de T .... 2.1.6. Arrays dels shells de C i de T ........................................... 2.1.7. Pas de parmetres i la seva gesti en els guions dels shells de C i de T ....................................................... 2.2. Guions dinici i de final de sessi en els shells de C i de T ..... 2.3. Ordres de referncia ................................................................... 3. El shell de Korn ................................................................................. 3.1. El shell de K ................................................................................. 3.1.1. Informaci general del shell de Korn ............................. 3.1.2. Gesti de les variables en el shell de Korn .................... 3.1.3. Acabar un shell de Korn ................................................... 3.1.4. Estructures de control del shell de Korn .......................
68 68 68 70 76 76 81 83 83 84 86 88 88 88 90 95 95
3.1.5. Expressions matemtiques en els shells de Korn ........ 104 3.1.6. Arrays en el shell de Korn ................................................ 106 3.1.7. Funcions del shell de Korn .............................................. 107 3.1.8. Pas de parmetres i la seva gesti en els guions del shell de Korn ............................................................... 111 3.2. Guions dinici i de final de sessi .............................................. 112 3.3. Ordres de referncia ................................................................... 113
Sistemes operatius
Introducci
Per dissenyar programes informtics de certa complexitat podem utilitzar els llenguatges de programaci d'alt, mitj i baix nivell. A nivell de sistema informtic, la majoria dels sistemes operatius i en particular el sistema operatiu Unix disposa de bastantes eines (shells) per desenvolupar programes informtics (guions) de cert nivell de complexitat i que faciliten i agilitzen l'administraci dels sistemes operatius Unix. Per tot aix i altres raons, creiem que s bsic conixer i saber utilitzar i aplicar aquestes eines que permeten desenvolupar d'una manera ms fcil diferents tipus de tasques relacionades amb l'administraci del sistema Unix. Aquesta unitat pretn donar els coneixements i les bases del funcionament dels principals shells del sistema Unix: el shell de Bourne, el shell de Bash, el shell de C, el shell de T i el shell de Korn. Molts usuaris els utilitzen com a eina de treball i daprenentatge del sistema informtic Unix. En el nucli dactivitat Intrprets dordres del sistema Unix. Shells de Bourne i de Bash, estudiareu la diferncia entre els llenguatges de programaci compilats i els llenguatges interpretats. Seguidament treballareu diversos aspectes relacionats amb els intrprets dordres del sistema Unix, com sn el seu funcionament, els tipus i les caracterstiques ms importants dels shells de Bourne i de Bash. Ms endavant tamb introduirem el concepte de gui i aprendrem a dissenyar-ne utilitzant les normes especfiques de cada un daquests shells. En el nucli dactivitat El shell de C i el shell de T, es fa un estudi daquests shells en termes molt generals com poden ser: les seves caracterstiques individualitzades, el seu funcionament i la relaci que podem trobar entre ells. Ms endavant, veurem la manera de gestionar els guions utilitzant les normes especfiques de cada un daquests shells. En el nucli dactivitat El shell de Korn, es fa un estudi de les principals caracterstiques daquest llenguatge de programaci i de la seva aplicaci en el disseny de guions. Per treballar els continguts daquesta unitat didctica, s convenient haver assolit una srie de continguts bsics relacionats amb aspectes tals com: Les unitats funcionals dels ordinadors: les seves caracterstiques, el funcionament, etc. Els sistemes operatius: les caracterstiques, les funcions, lestructura, els tipus, la importncia, el funcionament, etc.
Sistemes operatius
Els sistemes operatius multiusuari Unix: les seves caracterstiques i la utilitzaci de les principals ordres daquest sistema. Aquesta s una unitat didctica eminentment prctica. s convenient anar fent les activitats i els exercicis dautoavaluaci.
Sistemes operatius
Objectius
En acabar la unitat didctica heu de ser capaos del segent: 1. Conixer les principals funcions dels intrprets dordres del sistema Unix. 2. Saber diferenciar el funcionament entre els programes compilats i els programes interpretats. 3. Conixer les principals caracterstiques dels shells del sistema Unix. 4. Dissenyar guions utilitzant els principals shells del sistema Unix. 5. Dissenyar guions utilitzant el pas de permetres. 6. Adaptar els guions de comenament duna sessi a les necessitats particulars de cada usuari.
Sistemes operatius
Els usuaris utilitzen aplicacions informtiques o programes informtics que contenen les seqncies d'accions que ha de seguir un ordinador per resoldre un determinat problema. L'ordinador utilitza el seu propi llenguatge que per a nosaltres s molt complicat de fer servir; en canvi, els analistes i programadors utilitzen altres llenguatges ms fcils de gestionar per a ells per inintelligibles per a l'ordinador.
1.1. Traductors
Avui en dia podrem dir que quasi s impossible no trobar una aplicaci ja programada per a qualsevol tasca que puguem pensar. No obstant aix, moltes vegades aquestes aplicacions no ofereixen les opcions que volem o simplement volem fer una tasca tan concreta que no s possible trobar una aplicaci que la faci. En aquests casos, tenim dues opcions possibles: resignar-nos i esperar que alg dissenyi laplicaci, o dissenyar-la nosaltres mateixos. En qualsevol sistema de tipus Unix, la programaci est a lordre del dia i es pot utilitzar el sistema sense necessitat de programar una lnia de codi. Ara b, escrivint algunes lnies de codi podem fer que la nostra feina sigui ms fcil i treure tot el partit possible a un sistema obert com s el GNU/Linux. ! Habitualment, la programaci es considera com una cosa bastant complexa, reservada a uns quants. Tanmateix, hi ha molts nivells de programaci de ms o menys complexitat i en algunes situacions s ms senzill que no sembla en un principi. ! Els programadors utilitzen llenguatges de comunicaci amb l'ordinador diferents del que aquest utilitza, per aix cal fer servir alguna eina que faci la traducci en els dos sentits: d'usuari a ordinador i d'ordinador a usuari.
Un programa s una seqncia de nmeros que tenen un significat especial per al processador del nostre ordinador. Aquesta seqncia de nmeros rep el nom de codi mquina.
El llenguatge mquina s el llenguatge utilitzat pels ordinadors i est basat en dos estats: passar corrent (on o 0) i no passar corrent (off o 1).
Sistemes operatius
Quan executem un programa, aquest codi mquina passa del disc a la memria i una vegada all, el processador comena a executar la seqncia des del principi, agafant cada un daquests nmeros i fent una determinada operaci que hi est associada. El codi emprat noms t significat en un processador concret, ja que altres processadors podrien fer servir un determinat nmero (codi mquina) per fer la mateixa operaci. Aquesta s la ra per la qual un programa executable noms pot funcionar en la mquina per a la qual sha creat. Com a usuaris del sistema operatiu GNU/Linux, molts de nosaltres ens hem trobat amb aplicacions que no es distribueixen com un programa executable, sin que cal generar aquest programa utilitzant determinades ordres. Aix ens permet, si tenim cura en el disseny dels nostres programes, crear executables per a diferents arquitectures i aix el nostre programa funcionar en altres sistemes sense que calgui distribuir versions executables per a cada sistema. Realment, els programes executables sn ms complexos i no depenen noms del processador per al qual han estat generats sin tamb del sistema operatiu i de lentorn de desenvolupament en el qual han de funcionar. !
Un llenguatge de programaci no existeix fsicament, simplement s un conjunt de paraules clau i regles que fixen la manera de combinar aquestes paraules. El conjunt daquests elements rep el nom de codi font.
Normalment, el codi font pren la forma dun fitxer de text, en el qual trobem una seqncia de les paraules clau del llenguatge de programaci que sha utilitzat i que, combinades segons les regles que defineix el llenguatge mateix, permeten aconseguir els objectius del programa. Lestructura que defineix cada llenguatge de programaci en defineix el nivell. Aix, els llenguatges de programaci es poden classificar en llenguatges de baix nivell i llenguatges dalt nivell.
Exemple de llenguatge de baix nivell Un exemple de llenguatge de baix nivell s lassemblador, el qual defineix les paraules per representar els codis numrics que entn el processador. Algunes paraules les entn directament la mquina.
Els llenguatges de programaci de baix nivell sn aquells que estan ms propers al codi mquina que al nostre llenguatge.
Sistemes operatius
10
Els llenguatges dalt nivell sn ms propers al llenguatge natural (normalment lidioma angls) que al de la mquina.
Els llenguatges de programaci sn entitats abstractes, no existeixen fsicament. Ens indiquen com sha descriure un fitxer que cont codi font per a aquest llenguatge, perqu altres programes entenguin qu s el que volem que faci la nostra aplicaci. Aquests programes que han dentendre el llenguatge de programaci perqu el nostre programa es pugui executar sanomenen traductors i es poden classificar-se en dues categories: compiladors i intrprets.
Hi ha molts llenguatges que es poden considerar dalt nivell: el llenguatge C, el Cobol, el Pascal, lAda, el Visual Basic, etc.
Un compilador dun determinat llenguatge de programaci s un programa que agafa un fitxer en codi font escrit en aquest llenguatge de programaci i el converteix en una seqncia de codi mquina, una srie de nombres comprensibles per la mquina.
La srie de nombres en qu un compilador converteix un fitxer de codi font rep el nom de codi objecte i no s executable per la mquina. s necessari fer una altra operaci abans de poder executar el programa, que sanomena enllaar (link). !
Un intrpret dun llenguatge de programaci s un programa que agafa les ordres del codi font, comprova la sintaxi i executa un tros de codi mquina relacionat amb aquestes ordres.
Lavantatge fonamental duna implementaci interpretada s que en un principi ser multiplataforma. Aix vol dir que lnic recurs que ha de complir un sistema per executar-se s disposar duna versi de lintrpret. Ja no depn de quin sistema operatiu o tipus de processador tingui el nostre ordinador. El desavantatge de la implementaci interpretada s que normalment s ms lenta i necessita ms recursos (de memria, de CPU, etc.) per executar-se. Els avantatges i els desavantatges dels compiladors sn precisament els contraris. En la figura 1 teniu un esquema sobre el procs de compilaci i dinterpretaci. !
Sistemes operatius
11
A efectes prctics, els enllaadors ens permeten: Combinar diversos fitxers en codi objecte en un nic executable. Quan el programa s de grandria considerable s convenient dividir el codi font en diversos fitxers i compilar-los cada un separadament i desprs enllaar-los. Utilitzar llibreries de codi. Una llibreria s un conjunt de mduls de codi objecte que sempaqueten junts, ja que sutilitzen habitualment. Les llibreries donen noves facilitats en el disseny de programes. Les llibreries poden ser de dos tipus: esttiques i dinmiques. Les llibreries esttiques sincorporen a laplicaci com si fossin un altre mdul del programa, mentre que les llibreries dinmiques no sincorporen a laplicaci sin que estan situades en un fitxer separat en el sistema.
Sistemes operatius
12
Quan una aplicaci es carrega, el sistema busca les llibreries que necessita, les quals shan indicat en lenllaador, i les carrega en memria. Lavantatge daix s que els programes sn ms petits i que podem actualitzar llibreries sense que hgim de recompilar programes, sempre que no modifiquem la forma de cridar el codi que shi utilitza. El desavantatge s que si la llibreria dinmica no s al sistema, laplicaci no es pot executar. Aix es pot resoldre parcialment fent servir llibreries dinmiques enllaades dinmicament, cosa que permet fer crides al sistema perqu carregui les llibreries dinmiques noms quan les necessiti. Per fer lenlla de llibreries, lenllaador fa servir lordre enlla (link). Podem enllaar tant llibreries esttiques com dinmiques. Quan parlem denllaar de forma dinmica o esttica una llibreria dinmica, sutilitza lordre bind. !
Sanomena interfcie de programaci les regles que cal seguir per poder utilitzar un entorn determinat amb el qual aconseguim emprar els serveis que sofereixen duna manera ms fcil, rpida i agradable.
El kemel, el sistema operatiu, ofereix la seva prpia interfcie a travs de crides al sistema (en la figura 1 podeu veure un esquema sobre les crides). Aquestes crides permeten a les aplicacions utilitzar els serveis que ofereix el sistema, reservar blocs de memria, gestionar laccs a la informaci sobre fitxers, etc. Aquests recursos sn gestionats pel sistema i estan ocults a les aplicacions, les quals noms hi poden accedir per mitj de les crides al sistema. Normalment, aquestes interfcies reben el nom dAPI. Diferents sistemes ofereixen les seves prpies API, que podem utilitzar i conixer si ens interessen els serveis que ofereixen. !
Lintrpret dordres o shell s un programa informtic que llegeix lnies de text que un usuari dun ordinador ha predefinit. Aquest programa linterpreta per a un sistema operatiu o llenguatge de programaci.
Sistemes operatius
13
Normalment lexecuci de les ordres de lusuari es realitza per mitj duna interfcie de lnia dordres (CLI). Sacostuma a incorporar caracterstiques com el control de processos, els redireccionaments dentrada/sortida, els fitxers, la protecci, les comunicacions i un llenguatge dordres per escriure programes per lots o scripts. s possible que un sol sistema operatiu tingui diversos intrprets dordres o shells, s ms, la visi lgica dun sistema operatiu canvia segons lintrpret dordres utilitzat. Els principals intrprets dordres sn: El fitxer command.com en els sistemes DOS, Windows 95 i Windows 98. El fitxer cmd.exe en els sistemes Windows de la famlia NT i XP. LUnix shell s el nom assignat a lintrpret dordres en la famlia Unix. El Windows PowerShell s lintrpret dordres de Windows XP, Windows 2003 i Windows Vista.
El shell dUnix o shell Unix s lintrpret dordres dels sistemes de la famlia Unix.
Bsicament, els intrprets dordres funcionen donant una lnia dordres a lusuari i executant les ordres que es demanen. Per fer-ho el shell es bifurca en dos processos (mitjanant la crida al sistema a travs de lordre fork) i el procs fill se substitueix per la imatge del procs a executar mitjanant la crida execve. ! El procs pare espera que el fill (s a dir lordre executada) acabi (mitjanant una crida a la famlia wait) i informa lusuari del resultat de la seva execuci. Desprs es torna a invitar lusuari a executar una altra ordre, amb la qual cosa es repeteix el cicle. Alguns shells poden oferir caracterstiques avanades com lexecuci dordres en segon pla, la utilitzaci dlies, expressions regulars, etc. Hi ha bsicament dues famlies que tenen una sintaxi diferent. De cada famlia hi ha diverses implementacions: La famlia del shell de Bourne: com per exemple sh, bsh i ash. La famlia del shell de C: com csh i tcsh.
Sistemes operatius
14
Tamb hi ha shells derivats que incorporen caracterstiques de diverses famlies, per exemple Korn (ksh) i Z-shell (zsh).
Quan un usuari entra a Unix, el sistema li assigna per defecte un intrpret determinat, s a dir, un shell que comprovar que lordre escrita s correcta i es pot interpretar.
El sistema Unix disposa de diversos shells, la independncia dels quals respecte del nucli permet que Unix tingui diversos tipus de shells allats. Ladministrador del sistema s qui, tenint en compte les caracterstiques i preferncies de lusuari, assigna el tipus de shell ms adequat. Els tipus de shell ms comuns sn: Bourne shell: s el shell ms antic. Creat per Stephen Bourne, de Bell Laboratories dAT&T, s lintrpret original del sistema Unix. Tots els sistemes Unix disposen daquest shell. s un entorn molt limitat en certs aspectes (no es pot repetir o editar una ordre anterior, etc.), per s fcil dutilitzar. El nom de lintrpret s sh. El smbol de lintrpret en la consola s #, i en les estacions de treball s $. C shell: aquest shell va ser desenvolupat per Bill Joy, de la Universitat de Berkeley (Califrnia). s compatible en alguns aspectes amb el shell de Bourne. Alguns avantatges del C shell sn els segents: recorda ordres, crea lies, s compatible en molts aspectes amb el llenguatge C, etc. El smbol daquest shell en les estacions de treball s %. El fitxer intrpret daquest shell s csh. Korn shell: aquest shell va ser creat per David Korn, de Bell Laboratories dAT&T. s una modificaci del shell Bourne que permet ms prestacions i a ms ofereix tots els avantatges del shell de C. El fitxer intrpret daquest shell s ksh. C shell ests o shell de T: s un dels shells preferits pels programadors dUnix. s una versi ampliada del shell de C. El fitxer intrpret daquest shell s tcsh. Bash (bourne again shell): s el shell o la interfcie dordres que t ms popularitat en GNU/Linux i que s emprat per la majoria de partidaris del sistema operatiu Linux. Aquest shell t una srie de peculiaritats que permeten una manipulaci rpida i senzilla de GNU/Linux sense necessitat dentorns grfics. s el shell que fa servir Linux per defecte. Amplia les capacitats del shell de Bourne i ofereix edici en lnia. Va ser creat i distribut per GNU (Free Software Foundation). El shell de Bash pot utilitzar-se tant de manera text com amb X Windows. Lintrpret s el fitxer bash.
Sistemes operatius
15
En el sistema Unix, tamb hi podem trobar shells restringits que noms permeten fer s de certes caracterstiques de determinats shells.
Podem esmentar els segents shells restingits: Bourne shell restriction: s una restricci del shell de Bourne. Lintrpret s el fitxer rsh. Korn shell restriction: aquesta versi s la restricci del shell de Korn. El fitxer que gestiona aquest shell s rksh.
Si en qualsevol moment volem executar un shell diferent del carregat pel sistema noms cal teclejar el nom del seu fitxer intrpret dordres en la lnia dordres del sistema.
Els programes escrits per a un determinat intrpret dordres reben el nom de scripts, shell scripts, script shells i guions.
La potncia dels guions dels sistemes Unix resideix en la filosofia del sistema. El sistema disposa duna gran quantitat de petites aplicacions cada una de les quals fa operacions ms o menys complexes. Amb un suport addicional de programaci, dutilitzaci de variables, destructures de control de flux, etc., un gui ens permetr fer petites aplicacions emprant les que ja tenim.
Sistemes operatius
16
Algunes de les entrades dun gui poden ser dels tipus segents: Utilitats que volem que executi el shell (com les utilitats more, mail, etc.). Ordres que activin opcions del shell (com lordre set, etc.). Ordres que gestionin variables. Utilitats combinades (com la utilitzaci de canonades, etc.). Altres instruccions especials (laplicaci dlies en la repetici dordres, etc.). Estructures de control; com les ordres alternatives i les ordres repetitives. Un gui pot contenir el mateix tipus dinstruccions que podem introduir des del teclat. A ms, pot contenir instruccions ms especialitzades que controlen el funcionament del gui. Els sistemes operatius Unix disposen de diversos shells que podem utilitzar per dissenyar els guions corresponents. En alguns casos es poden fer servir diferents shells en un mateix gui. Normalment els shells ms emprats en els guions sn els que podeu veure en la taula 1.
Taula 1. Nom dels shells i el seu intrpret Nom del shell Shell de Bourne Shell de C Shell de Bash Nom intrpret sh csh bash ksh tcsh
Sistemes operatius
17
Per assolir els punts anteriors, disposem de diverses metodologies, una de les quals intenta resoldre el problema aplicant les tcniques segents: ! Una anlisi prvia del problema. Lanlisi funcional i orgnica del problema. La fase de programaci. La fase dexplotaci i manteniment. En resum podem indicar que de la mateixa manera que en dissenyar una aplicaci informtica abans de la fase de programaci hi ha dhaver un estudi del problema, tamb en el disseny dels guions sha daplicar la mateixa metodologia o una de semblant a les que es fan servir en el cas del disseny de les aplicacions informtiques. 2) Assignaci de permisos a un gui. Una vegada tenim creat el gui, no el podrem executar fins que tingui assignats els permisos adequats. La manera de fer-ho s donar el perms dexecuci al propietari del gui. Una possible manera de fer-ho s a travs de lordre chmod. En la taula 2 podeu veure com funciona lordre chmod.
Taula 2. Gestionar els permisos de fitxers chmod chmod [opcions] manera /cam/fitxer Objectiu Modificar els permisos dun o ms fitxers. Els usuaris que poden canviar els permisos dun directori i dun fitxer sn: lusuari root, el propietari del fitxer i el propietari del directori on hi ha els fitxers o directoris. Manera: cal indicar la manera de com podem modificar els permisos. Pot fer-se de manera: 1) Simblica. Sespecifica de la manera segent: qui operaci perms On qui pot tenir: u (representa el propietari), g (representa el grup dusuaris), o (representa els altres usuaris, i a (representa tots els usuaris). Operaci: es representa pels smbols segents: + (representa assignar un perms), -(representa treure un perms), i = (representa donar els permisos especificats i anullar tots els que tenia). Perms: pot ser r, w, x 2) Octal. Indica els permisos dun fitxer mitjanant el format octal: kxyz k: 0 (defecte), 1 (bit sticky), 2 (bit setgid), 4 (bit setuid). xyz: cada lletra s un nmero octal que representa els permisos del propietari, el grup i els altres, respectivament. Exemples de lordre chmod u+x /alfa Resultat de lordre El propietari del gui podr executar el gui alfa. Assignem el perms dexecuci al propietari del fitxer alfa.
3) Execuci de guions. En el sistema Unix hi ha diverses maneres dexecutar els guions dun determinat intrpret dordres. En la taula 3, teniu un resum sobre lexecuci dels guions en els intrprets dUnix.
Taula 3. Executar un gui execuci dels guions 1) intrpret_comandaments [opcions] /cam/gui 2) intrpret_comandaments [opcions] ./cam/gui 3) #!/bin/intrpret [opcions] ./cam/gui
Sistemes operatius
18
Execuci dels guions Objectiu Executar un gui. 1) Teclegem en el smbol del prompt del sistema el nom del fitxer que gestiona lintrpret que volem utilitzar: sh (shell de Bourne), bash (shell de Bash), csh (shell de C), tcsh (shell de T) i el ksh (shell de Korn) i, seguidament especifiquem el cam i el nom del gui a executar. 2) Teclegem en el smbol del prompt del sistema el nom del fitxer que gestiona lintrpret que volem utilitzar: sh (shell de Bourne), bash (shell de Bash), csh (shell de C), tcsh (shell de T) i el ksh (shell de Korn), En el smbol del prompt del sistema especifiquem el cam i el nom del gui a executar en una lnia diferent. 3) Afegim aquesta ordre com a primera lnia en el gui. En el smbol del prompt del sistema especifiquem el cam i el nom del gui a executar. Exemples de lordre sh /alfa sh /alfa /alfa Resultat de lordre Executa el gui alfa utilitzant lintrpret sh. Carrega lintrpret sh i seguidament executa el gui alfa. Executa el gui alfa utilitzant Iintrpret indicat en la primera lnia del gui: #!/bin/sh #!/bin/csh #!/bin/tcsh #!/bin/ksh csh /alfa ksh /alfa utilitza el shell de Bourne utilitza el shell de C utilitza el shell de T utilitza el shell de Korn #!/bin/bash utilitza el shell de Bash
Carrega lintrpret csh i seguidament executa el gui alfa. Executa el gui alfa utilitzant lintrpret ksh.
Sistemes operatius
19
va comenar a utilitzar-se en la versi 7 dUnix distribuda a escoles i universitats. Avui dia s un shell molt popular i el podem trobar en /bin/sh. Els principals objectius del shell de Bourne eren aprofitar dues caracterstiques del kernel de la versi 7 del sistema Unix: La llista de parmetres (arguments) ms llargs, fins a 8.192 bytes (abans 127 bytes). Les variables dentorn que permetien passar molta informaci als programes a travs del procs darrencada.
Versi de shell installada Si volem saber la versi de shell que tenim installada podem utilitzar lordre: echo $SHELL. Tamb podem saber tots els intrprets dordres que podem utilitzar en la distribuci dUnix que estem utilitzant a travs de lordre cat /etc/shells.
#! /bin/sh
Quan sexecuta aquest gui, sindica que el shell ha dutilitzar el shell de Bourne (sh).
3) Utilitzaci de carcters especials: podem fer servir tots els metacarcters, com les dobles cometes (), les cometes senzilles (), laccent greu (`), el backslash (\), el dlar ($), la pipeline (|), i els canvis dadrea (>, <, >>, <>, &, <<). El carcter escape (\) sutilitza per canviar el significat dun carcter. Per ferho, cal posar abans del carcter que volem canviar el seu significat, el carcter escape. Per exemple, echo \*. Un problema que ens podem trobar s com escriure una ordre que ocupa diverses lnies. Per fer-ho podem utilitzar el carcOrdres simples Una ordre simple s una lnia formada pel nom duna ordre amb la possibilitat de tenir opcions i arguments. Per exemple, ls -l /fita (ls representa el nom de lordre; -l s lopci i /fita s largument).
Sistemes operatius
20
ter escape per ignorar els retorns de carro en els salts de lnies. En la taula 5 podeu veure uns exemples sobre la utilitzaci dels carcters especials.
Taula 5. Exemples d'utilitzaci dels carcters especials Exemples dordres echo Avui s dijous echo "Avui s dijous" institut="IES" echo "El meu institut s un \$institut" echo El meu institut s un $institut institut="IES" echo "El meu institut s un $institut" echo el smbol \* echo `ls l` echo Avui s dilluns dia 23 de maig \ de lany \ 2007. echo El meu smbol s \* echo "El meu smbol s *" echo El meu smbol s * ls l | more cat > /fita cat /alfa 1>/omega 2>/dev/null Visualitza el contingut del directori on estem en format llarg pgina a pgina. Tot el que escrivim es guarda en el fitxer fita una vegada hem teclejat <CTRL> + <D>. Si existeix el fitxer alfa, el seu contingut es guarda en el fitxer omega, en cas contrari el text derror senvia al dispositiu nul. Si existeix el fitxer alfa, el seu contingut es guarda en el fitxer omega, en cas contrari el text derror tamb senvia al fitxer omega. Tot el que escrivim es guarda en el fitxer prova fins que escrivim EOF. Visualitza El meu smbol s *. Visualitza el smbol * Visualitza el contingut del directori on estem en format llarg. Visualitza: Avui s dilluns dia 23 de maig de lany 2007. Visualitza El meu institut s un $institut. Resultat Visualitza Avui s dijous. Visualitza Avui s dijous. Visualitza El meu institut s un IES.
4) En el shell de Bourne tamb podem utilitzar els segents smbols com a patrons: *, ?, [valor1...valorn], [valor1-valorn], [!valor1...valorn] i [!valor1-valorn]. En la taula 6, teniu exemples dutilitzaci dels carcters patrons.
Taula 6. Aplicaci dels carcters patrons Exemples dordres ls al* ls al? [ace] [a-d] [!ace] [!a-d] Resultat Visualitza els noms del fitxers que comencen per al i a continuaci tenen zero o ms carcters. Visualitza els noms del fitxers que comencen per al i a continuaci tenen un carcter. Fem referncia als carcters a, c o e. Fem referncia als carcters que van des da fins a d. Fem referncia a qualsevol carcter diferent dels carcters a, c o e. Fem referncia a qualsevol carcter diferent dels carcters que van des da fins a d.
Sistemes operatius
21
5) Ordres simples: una ordre simple est formada a partir de paraules separades per espais. La primera paraula s el nom de lordre que sexecutar (el shell utilitza la variable dentorn PATH, que explicarem ms endavant, per determinar els llocs on ha danar a buscar els fitxers executables). La resta de paraules (hi ha algunes excepcions) sanomenen arguments i es passen a lordre, perqu les utilitzi.
Les ordres Unix tenen un estat de sortida, que s un valor retornat per lordre al shell, on sindica el resultat del funcionament daquesta ordre. Generalment un estat de sortida 0 informa que tot ha anat b, mentre que valors diferents de zero indiquen alguna classe de problemes en lexecuci de lordre.
6) Llistes dordres: una llista dordres s una seqncia dordres (pipelines) separades pels smbols: ;, &, && i ||. Smbol ;. Fa que les ordres de la llista sexecutin luna darrere de laltra. Smbol &. Fa que lexecuci de les ordres de la llista es faci en background (segon pla). Aix vol dir que el procs es collocar en una cua a lespera de ser processat ms tard (quan la crrega del sistema sigui baixa). La manera habitual en qu el shell espera executar un procs de manera immediata sanomena execuci immediata (foreground). Smbol &&. La llista segent sexecutar nicament quan la pipeline anterior retorni un estat de sortida zero (xit). Smbol ||. s la situaci contrria a &&. Noms sexecutar si la pipeline anterior retorna un codi estat diferent de zero (fracs). Les ordres && i || tenen la mateixa prioritat i aquestes sn ms grans que les de & i ;. En la taula 7, teniu exemples sobre la utilitzaci de les llistes dordres.
Taula 7. Aplicaci de les llistes d'ordres Exemples dordres clear; ls -l; date; sleep 10; clear Resultat Neteja la pantalla, visualitza el contingut del directori on estem situats, visualitza la data, espera 10 segons i neteja la pantalla. Executa en segon pla aquestes tres ordres. Si lordre ls l sha executat correctament, sexecuta lordre date. Si lordre cat /alfa sha executat correctament, no sexecuta lordre date.
La pipeline s una tcnica en qu podem executar diverses ordres en una mateixa lnia.
ls l & date & who &. ls l && date. cat /alfa || date.
Sistemes operatius
22
7) Agrupament dordres: els parntesis ( ) i les claus { } sutilitzen per agrupar ordres, per no fan la mateixa funci. ! Els parntesis ( ) fan que la llista sexecuti mitjanant un subshell; s a dir, el shell actual inicia un nou shell, el qual executar les ordres de la llista. Quan el subshell acaba la llista, desapareix, i el shell original torna a agafar el control. El format de les claus { } s diferent. La llista ha dacabar amb ; i s necessari un espai en blanc desprs de la clau dobrir i abans de la clau de tancar. La diferencia ms important entre parntesis i claus s que amb les claus les ordres de la llista sn executats pel shell actual. En la taula 8, teniu alguns exemples sobre la utilitzaci de les agrupacions dordres.
Taula 8. Aplicaci de les agrupacions d'ordres Exemples dordres (date; who; ps)>/fita { clear; date; who; } Resultat El resultat daquestes tres ordres s guarden en el fitxer fita. Sexecuten en un subshell. Executa aquestes tres ordres en el mateix shell.
Exemple de les fases a seguir per a la gesti dun gui Creem un gui anomenat prova1 que presenti la data del sistema per pantalla. Una soluci podria ser la segent: 1) Analitzar el problema i buscar-hi una soluci lgica. 2) Cridar un editor dUnix, per exemple el vi, i escriure les ordres segents: #!/bin/sh # El nom del gui s: prova1 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Visualitza la data del sistema # *************bloc principal ***************** clear date sleep 10 clear exit 0 # ****************Final*************
3) Abans de sortir de leditor, cal salvar el gui amb el nom de prova1. 4) Una vegada en el sistema, hem de posar el perms dexecuci al propietari del fitxer mitjanant lordre segent: chmod u+x prova1
5) Ara ja estem en condicions dexecutar el fitxer. Ho podem fer dalguna de les segents maneres: a) sh ./prova1 b) sh ./prova1 c) ./prova1
Sistemes operatius
23
Una variable shell s un nom que t valors o a la qual sen poden assignar.
Sistemes operatius
24
$nom_variable Exemples de lordre DIRECTORI=/usr/josep echo $DIRECTORI DIRECTORI=/usr/josep DIRECTORI=$DIRECTORI:/usr:/home echo $DIRECTORI Resultat de lordre Assigna a la variable DIRECTORI la informaci / usr/josep. Visualitza el contingut de la variable DIRECTORI. Assigna a la variable DIRECTORI la informaci / usr/josep. Afegeix a la variable DIRECTORI lexpressi :/ usr:/home Visualitza el contingut de la variable DIRECTORI. DIRECTORI=/usr/josep DIRECTORI="$DIRECTORI":/usr:/home echo "$DIRECTORI" Assigna a la variable DIRECTORI la informaci / usr/josep. Afegeix a la variable DIRECTORI lexpressi :/ usr:/home Visualitza el contingut de la variable DIRECTORI. NOM="Josep Mart Balmes" echo $NOMbre NOM="Jos" echo ${NOM}ep Donar un error, ja que la variable NOMbre no existeix. Assigna a la variable NOM la informaci Jos. Visualitza el contingut de la variable NOM afegint la paraula ep (Josep).
Tipus de variables
No totes les variables que utilitzem en lentorn sn del mateix tipus. Les podem classificar de la manera segent: 1) Definides per lusuari: sn variables creades per lusuari. Per gestionar-les shan de seguir els passos que acabem dindicar. Aquestes variables desapareixen en el moment que acaben una sessi en Unix o b quan nosaltres ho decidim. 2) Definides pel sistema: el shell utilitza diverses variables que sn creades i a les quals sassignen valors durant el procs de connexi. Tota la informaci que el sistema ens assigna sanomena entorn. Quan sinvoca el shell de connexi al sistema, aquest busca un entorn estndard proporcionat pel sistema i crea noves variables shell amb els noms especificats i els valors indicats. Lentorn es pot modificar amb noves definicions en el fitxer .profile (Unix) o utilitzant la lnia de la interfcie dusuari. Si no hi fem canvis, lentorn estndard es passar a qualsevol ordre executada pel shell o per qualsevol subshell. En la taula 11, hi ha descrites algunes variables del sistema.
Taula 11. Nom i descripci d'algunes variables del sistema Nom de variable PATH Descripci Aquesta variable sutilitza per indicar en quins directoris shan de buscar els fitxers executables. Els diferents directoris shan de separar amb el smbol dels dos punts (:). El seu format s el segent: PATH=/cam/directori1:/cam/directori2:..:/cam/directorin LOGNAME PS1 El nom del compte. Aquesta variable cont la cadena primria del prompt que apareix quan el shell esta esperant una ordre. Per defecte s el smbol $.
Entorn Lentorn s la zona disponible per part dun determinat usuari. Aquesta zona fa referncia a les variables que t assignades, les eines que pot utilitzar, els recursos disponibles, etc.
Sistemes operatius
25
Descripci El nom del directori de treball. Cont la cadena del prompt secundari i surt quan el shell espera que vosaltres completeu una ordre que vreu comenar en la lnia anterior. Per defecte s el smbol >. Indica el lloc on anirem a parar en lestructura darbre quan executem lordre cd. Indica el directori de lusuari. Cont el separador de les paraules. Cont el nom del shell utilitzat per defecte. El valor daquesta variable ser /bin/sh si estem executant el shell de Bourne. Cont el nom del lloc on est situada la nostra bstia de correu. Visualitza el contingut de la variable PATH
Exemple de laplicaci de les variables del sistema en un gui Creem un gui anomenat prova2 que presenti el nom de lusuari, lintrpret dordres utilitzat, el smbol del prompt principal i secundari, el directori de lusuari, els llocs on busca els programes executables i el lloc de la nostra bstia. Una soluci podria ser la segent: #!/bin/sh # El nom del gui s: prova2 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar el contingut de les variables del sistema # *************bloc principal ***************** clear echo " El nom de lusuari s: $LOGNAME" echo " El shell utilitzat s: $SHELL" echo " El prompt principal s: $PS1" echo " El prompt secundari s: $PS2" echo " El directori dusuari s: $HOME" echo " Els directoris on Unix busca els programes executables sn: $PATH" echo " La bstia est situada a: $MAIL" sleep 10 clear exit 0 # ****************Final*************
3) Variables especials. El shell de Bourne defineix de manera automtica els valors dun conjunt de variables especials que es troben permanentment configurades durant la vida del gui. En la taula 12, teniu informaci sobre la utilitzaci de les variables especials.
Taula 12. Variables especials 0/1..9/#/*/?/$/!/@ Objectiu 0: guarda el nom del gui. 1..9: fa referncia a la posici dels arguments passats a un gui. #: guarda el nmero darguments passats a un gui. *: guarda els arguments passats a un gui. ?: guarda el valor de lestat de sortida de lltima ordre executada. $: Guarda el PID de lltim procs. !: guarda el PID del procs executat en background. @: igual que * per amb dobles cometes.
Sistemes operatius
26
0/1..9/#/*/?/$/!/@ Exemples de lordre echo $0 echo $7 echo $# echo $* echo $? echo $$ echo $! Resultat de lordre Visualitza el nom del gui Visualitza el contingut de largument 7 passat al gui. Visualitza el nombre darguments passats al gui. Visualitza el nom dels arguments passats al gui. Visualitza el valor de lestat de sortida de lltima ordre executada. Visualitza el nmero del PID del procs. Visualitza el nmero del PID del procs executat en background.
Exemple de laplicaci de les variables especials en un gui Creem un gui anomenat prova3 que presenti el nom del gui, el nombre de parmetres passats i els seus noms, lestat de sortida i el PID del gui. Una soluci podria ser la segent: #!/bin/sh # El nom del gui s: prova3 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar variables especials del sistema # *************bloc principal ***************** clear echo " El nom del gui s: ${0}" echo " El nombre de parmetres passats al gui sn: $#" echo " Els noms del parmetres passats sn : $*" echo " Lestat de sortida s: $? " echo " El PID del gui s: : $$" sleep 10 clear exit 0 # ****************Final*************
Les variables globals sn aquelles el contingut de les quals es pot utilitzar tant en el shell en qu han estat creades com en els seus possibles subshells.
Sistemes operatius
27
Les variables locals es poden fer servir en el shell en el qual han estat creades, per no en els seus possibles subshells. Per poderho fer cal exportar-les, tcnica que saconsegueix per mitj de lordre export.
Taula 13. Exportar variables export export nom-varible1...nom-variablen Objectiu Utilitzar les variables declarades en aquesta ordre en altres subshells. Exemples de lordre DOG="Joan" sh echo $DOG exit 0 DOG="Joan" export DOG sh echo $DOG exit 0 Ara s que podem visualitzar el contingut de la variable DOG, ja que s una variable global (exportada amb lordre export). Resultat de lordre El contingut de la variable DOG no el podem visualitzar, ja que s una variable local i ha de ser global.
Eliminaci de variables
De la mateixa manera que podem crear variables, tamb en qualsevol moment podem anullar-les sense haver dacabar una sessi en Unix. Lordre
Sistemes operatius
28
que ens permet fer aquestes funcions s unset. En la taula 15, teniu informaci sobre la manera deliminar variables.
Taula 15. Eliminar variables unset unset nom_variable1...nom_variablen Objectiu Eliminar les variables indicades. Exemples de lordre unset DIRECTORI DOG Resultat de lordre Elimina les variables DIRECTORI i DOG.
Exemple dentrada de dades mitjanant el teclat i la seva visualitzaci Dissenyem un gui anomenat prova4 que ens pregunti el nom i cognoms, seguidament ha de visualitzar la informaci entrada. #!/bin/sh # El nom del gui s: prova4 # La data de creaci: 17-10-99 # La persona que ha creat aquest gui s: jee # Pregunta el nom i cognoms duna persona i els visualitza en una lnia # -----------------bloc principal -------------------------clear echo -n "Quin s el teu nom?:" read nom echo -n "i els teus dos cognoms?:" read cognom1 cognom2 echo " El meu nom i cognoms sn: $nom, $cognom1, $cognom2" sleep 10 clear # ----------------fi--------------------
Sistemes operatius
29
gui shell desapareix i el control retorna al shell pare. A vegades, ens pot interessar acabar un determinat gui en un moment precs i retornar un valor destat al gui pare per a possibles preses de decisions. Totes aquestes situacions les podem gestionar mitjanant lordre exit. En la taula 17, teniu informaci sobre lordre exit.
Taula 17. Acabar un gui exit exit [n] Objectiu Acabar un gui i tornar el control al seu gui pare. El smbol n representa un nombre que indica lestat de sortida. Si no especifiquem cap valor retorna lestat de lltima ordre executada. Exemples de lordre exit Resultat de lordre Retorna al shell pare. El valor destat retornat ser el valor corresponent a lltima ordre executada. Retorna al shell pare. El valor destat retornat ser 0.
exit 0
Quan una ordre acaba lexecuci, ninforma el shell mitjanant el que sanomena informe destat. Aix permet al shell saber que ja pot executar una nova ordre. La majoria de les ordres de lUnix limiten linforme destat a xit o fracs.
Linforme destat s un nombre enter que sanomena valor destat de lordre o valor retornat per lordre. Com a norma, les ordres utilitzen el valor 0 per informar de lxit en lexecuci de lordre i diferent de zero per informar de fracs.
Quan dissenyem un gui hem dintentar que estigui ben estructurat. Per aconseguir-ho, el shell t diverses formes dordres estructurades, semblants a les que sutilitzen en els llenguatges de programaci tradicional. Cada una daquestes estructures es considera una ordre simple i pot ser un element duna llista o duna pipeline. En aquestes estructures, el gui actuar duna manera o duna altra segons si es compleixen o no una o ms condicions.
Sistemes operatius
30
Sistemes operatius
31
test/[ ] Exemples de lordre [ "${HOME} " = /home/josep ] echo $? [ "Hola" = "mn" ] echo $? NUM=10 [ $NUM gt 10 ] echo $? [ -d josep ] echo $? [ -f prova -a -x prova ] echo $? [ -c users -o -d directori ] echo $? Retorna 0 ja que s veritat una o totes les condicions. Retorna 0 ja que sn veritat les condicions. Retorna 0 ja que s veritat la condici. Retorna 1 ja que la condici s falsa. Retorna 1 ja que s falsa la condici. Resultat de lordre Retorna 0 ja que s veritat la condici.
Estructures alternatives
En el shell de Bourne podem utilitzar les estructures de control anomenades alternatives.
Una estructura alternativa s un conjunt daccions que en funci del resultat dunes determinades condicions (veritat o fals) sactua executant unes o altres accions. El resultat sempre ser de tipus boole (veritat o fals). Per exemple, si avui fa bon temps anir a caminar; en cas contrari, em quedar a casa.
Dintre de les estructures alternatives podem trobar com a ordres ms representatives les ordres if i case: 1) if. Hi ha diversos formats de lestructura alternativa if: if-then-fi (taula 19), if-then-else-fi (taula 20) i if-then-elif-else-fi (taula 21).
Taula 19. Format de l'ordre if if-then-fi if condici then acci(ns) fi Objectiu Si la condici es verifica, executa les accions indicades a partir del bloc then. Si no es compleix la condici, no executa el bloc then i continua a partir de la instrucci segent del bloc if-fi. Exemples de lordre if [ 5 -lt 10 ] then echo ok fi Resultat de lordre Comprova la condici. Ja que s veritat la condici escriu la paraula ok.
Sistemes operatius
32
if-then-fi Exemples de lordre NOM="Divendres" if [ "$NOM" = " Divendres" ] then echo ok fi if test "${USER}" != " root " ; then echo "incorrecte, tu has dsser el supervisor" exit 1 fi echo " Executant el programa" Taula 20. Format de l'ordre if/else if-then-else-fi if condici then acci(ns) else acci(ns) fi Objectiu Si la condici es verifica, executa les accions indicades a partir del bloc then i una vegada executades continua a partir de la segent ordre del bloc if-fi. Si no es compleix la condici, executa les accions del bloc else i continua a partir de la instrucci segent del bloc if-fi. Exemples de lordre if [ "$NUM" -lt 10 ] then echo ok else echo fals fi NOM="Divendres" if [ "$NOM" = " Dilluns" ] then echo ok else echo "Dilluns" fi Taula 21. Format de l'ordre if/elif/else if-then-elif-else-fi if condici then acci(ns) elif condici then acci(ns) elif condici then acci(ns) ....................... else acci(ns) fi Comprova la condici. La condici s falsa i per tant escriu la paraula Dilluns. Resultat de lordre Comprova la condici. Si s veritat la condici escriu la paraula ok, en cas contrari escriu la paraula fals. Comprova la condici i si la condici s veritat escriu el text incorrecte..., i acaba lexecuci del gui amb lestat de sortida a 1. En cas contrari executa lordre que est a continuaci del bloc if-fi, s a dir visualitza el rtol Executant... Resultat de lordre Comprova la condici. Ja que s veritat la condici escriu la paraula ok.
Sistemes operatius
33
if-then-elif-else-fi Objectiu Si la primera condici es verifica, sexecuten les accions indicades a partir del bloc then i una vegada executades continua a partir de la segent ordre del bloc if-fi Si no es compleix la condici, comprova la primera condici del bloc elif. Si es compleix la condici executa les accions daquest bloc i continua a partir de la segent acci del bloc if-fi. En cas de no complirse la primera condici del bloc elif, passa a comprovar les segents condicions dels segents bloc elif, i executa el bloc daccions si es compleix alguna de les condicions. En el cas de no complir-se cap de les condicions sexecuten les accions del bloc else i continua a partir de la instrucci segent del bloc if-fi. Exemples de lordre if [ -x ${FILE} ] ; then ${FILE} elif [ -w ${FILE} ; then vi ${FILE} else echo "${FILE} no s executable i tampoc hi podem escriure" exit 1 fi Resultat de lordre Comprova si el fitxer representat per la variable FILE s executable, en cas afirmatiu lexecuta. Si el fitxer no s executable comprova si el podem modificar, en cas afirmatiu el manipulem mitjanant leditor vi. Si el fitxer no s executable ni modificable amb leditor vi, aleshores visualitzem un text relacionat amb aquesta situaci.
2) case. Lestructura case inicialitza la selecci dacord amb el valor duna variable i en funci del seu contingut actua duna manera o duna altra. En la taula 22, teniu informaci sobre el bloc case-esac.
Taula 22. Format de l'ordre case case-esac case variable in patr1) accio1 acci2 ............ accin ;; patr2) accio1 acci2 ............ accin ;; patr3) accio1 acci2 ............ accin ;; ..................... *) accio1 acci2 ............ accin ;; esac
Sistemes operatius
34
case-esac Objectiu Lordre agafa el contingut de la variable i comprova amb quin patr coincideix. En funci del resultat, executa les accions corresponents. Una vegada executades aquestes accions, surt del bloc case-esac i continua amb la segent instrucci del bloc. En el cas que el contingut de la paraula no coincideixi amb cap patr, executa les accions del bloc indicat en * i continua lexecuci a partir de lordre que hi ha a continuaci del bloc case-esac. Exemples de lordre VALOR=/prova case ${VALOR} in -f) FILE="${VALOR}" ;; -d) DIR="${VALOR}" ;; *) echo "No s un fitxer ni un directori" ;; esac Exemple daplicaci de les estructures alternatives (if) Dissenyem un gui anomenat positiu, que pregunti un nombre a lusuari. El gui ens ha de dir si el nombre entrat s positiu. #!/bin/sh # El nom del gui s: positiu # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Permet saber si un nombre enter s positiu # ----------------------bloc principal -------------------------clear echo -n "Dnam un nombre:" read nombre if test $nombre -gt 0 then echo "El nombre entrat: $nombre s positiu" else echo "El nombre entrat: $nombre no s positiu" fi echo -n "Prmer qualsevol tecla per a continuar." read tecla clear exit 0 # -------------------------fi---------------------------Exemple daplicaci de les estructures alternatives (case) Fem un gui anomenat buscar que pregunti un nmero, i si el nmero entrat s 2, 50, o -45, visualitzi la paraula "Veritat" i en cas contrari, presenti la paraula "Fals". #!/bin/sh # El nom del gui s: buscar # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Permet saber si un nombre entrat coincideix amb algun dels nombres: 2, 50, o -45 # -------------------bloc principal------------------------clear echo -n "Dnam un nombre:" read nombre case $nombre in 2) echo "Veritat";; 50) echo "Veritat";; -45) echo "Veritat";; *) echo "Fals";; esac echo -n "Prmer tecla per a continuar." read tecla Resultat de lordre La primera i segona condici permet comprovar si el contingut de la variable VALOR s un fitxer o un directori. En el cas de ser un fitxer es guarda el contingut de la variable VALOR en la variable FILE. Si el contingut de la variable VALOR s un directori s guarda en la variable DIR. Si el contingut de la variable VALOR no s un fitxer ni un directori s visualitza el text relacionat amb aquesta situaci.
Sistemes operatius
35
Estructures repetitives
En el shell de Bourne tamb podem utilitzar les estructures de control anomenades repetitives.
Una estructura repetitiva s un conjunt daccions que es van repetint mentre es compleixen determinades condicions.
Dintre del grup destructures repetitives podem trobar com a ordres ms representatives les ordres while (taula 23), until (taula 24) i for (taula 25):
Taula 23. Format de l'ordre while while while condici do acci(ns) done Objectiu Si s veritat el resultat de la condici, repeteix el bloc de les accions indicades entre do i done. Una vegada lacci ha arribat a lordre done, aquesta la reenvia a la lnia de lordre while i es torna a comprovar la condici. Quan el valor retornat de la condici s fals, lexecuci passa a la segent ordre del bloc do-done. Exemples de lordre i=1 while [ ${i} -le 5 ] do echo ${i} i=`expr ${i} + 1` done Resultat de lordre Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui ms petit o igual que 5 anir visualitzant el seu contingut. Lordre expr (ms endavant comentarem les caracterstiques daquesta ordre), ens permet anar incrementant el valor de la variable i.
Taula 24. Format de l'ordre until until until condici do acci(ns) done Objectiu Executa les accions situades entre el do i done fins que el valor retornat per la condici s veritat. Exemples de lordre i=1 until [ ${i} -eq 5 ] do echo ${i} i=`expr ${i} + 1` done Resultat de lordre Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui diferent de 5 anir visualitzant-ne el contingut. Lordre expr (ms endavant comentarem les caracterstiques daquesta ordre), ens permet anar incrementant el valor de la variable i.
Sistemes operatius
36
Taula 25. Format de l'ordre for for for variable in llista - valors do acci(ns) done Objectiu Repeteix les accions indicades entre do i done un nombre de vegades que coincideix amb el nombre delements de la llista - valors. Exemples de lordre for VALOR in 10 2 37 40 do echo ${VALOR} done for FILE in `ls` do echo ${FILE} done Exemple d'aplicaci de les estructures repetitives (while) Dissenyem un gui anomenat repetir que ens pregunti nombres fins que entrem el nombre -1. #!/bin/sh # El nom del gui s: repetir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Ens pregunta nombres fins que hem entrat el -l # -----------------------bloc principal -------------------------nombre=0 while [ "$nombre" ne -1 ] do clear echo -n "Escriu un nombre:" read nombre done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 # -------------------fi----------------------------Exemple d'aplicaci de les estructures repetitives (until) Dissenyem un gui anomenat repetir que ens pregunti nombres fins que entrem el nombre -1. Utilitzant lestructura until, podria dissenyar-se de la manera segent: #!/bin/sh # El nom del gui s: repetir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Ens pregunta nombres fins que hem entrat el -l # bloc principal -------------------------nombre=0 until test "$nombre" - eq -1 do clear echo -n "Escriu un nombre:" read nombre done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 # ----------------fi-------------------Visualitza el nom dels fitxers on estem situats. Resultat de lordre Inicialitza la variable VALOR amb el primer valor de la llista i visualitza el seu contingut, aix es repeteix amb tots els valors de la llista.
Sistemes operatius
37
Exemple d'aplicaci de les estructures repetitives (for) Dissenyem un gui anomenat per, que escrigui cinc vegades la paraula informtica. #!/bin/sh # El nom del gui s: per # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Escriu la paraula Informatica 5 vegades # --------------------bloc principal------------------------------clear for valor in 1 4 6 0 100 do echo "Informtica" done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 #------------fi------------
Exemple d'aplicaci de les estructures repetitives Dissenyem un gui anomenat pregunta que visualitzi la paraula Informtica mentre contestem a la pregunta Vols repetir lacci anterior?" per a qualsevol de les respostes segents: s, S, si, Si, y, Y. #!/bin/sh # El nom del gui s: pregunta # La data de creaci: 17-07-07 # La persona que ha creat aquest gui s: jee # Va escrivint la paraula Informtica mentre responem la pregunta "Vols repetir lacci anterior?", amb s, S, si, Si, y, Y. # -----------------bloc principal -------------------------clear resposta="s" while [ $resposta = "s" o $resposta = "S" o $resposta = "si" o $resposta = "Si" o $resposta = "y" o $resposta = "Y" ] do echo "Informtica" echo -n "Vols repetir lacci anterior (s, S, si, Si, y, Y)?: " read resposta done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 # ----------fi-----------------------------
Exemple d'aplicaci de les estructures repetitives Dissenyem un gui anomenat prova5 que controli la tecla de retorn #!/bin/sh # El nom del gui s: prova5 # La data de creaci: 17-10-99 # La persona que ha creat aquest gui s: jee # Controla lexecuci de la tecla de retorn #-------------------------bloc principal -------------------------repetir="" clear echo -n "Prmer una tecla:" read repetir while test "$repetir" = "" do echo -n "Has premut la tecla de retorno Prem una altra tecla" read repetir done
Sistemes operatius
38
echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 #-------------fi----------
Exemple d'aplicaci de les estructures repetitives Dissenyem un gui anomenat prova6 que ens pregunti el nom del sistema operatiu que estem estudiant (Unix) i tamb controli la tecla de retorn. #!/bin/sh # El nom del gui s: prova6 # La data de creaci: 17-10-99 # La persona que ha creat aquest gui s: jee # Controla lentrada del nom del nostre sistema i la pulsaci de la # tecla de retorn # -----------------------bloc principal -------------------------nom="" clear echo -n "Dnam el nom del sistema operatiu que ests estudiant:" read nom while test "$nom" = "" -o "$nom != "Unix" do echo -n "Has entrat una dada incorrecta. El nomdel sistema que estem treballant s \ lUnix. Torna a entrar el nom del sistema:" read nom done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 # -------fi---------------------
Control de bucles
En determinats moments podem necessitar sortir dels bucles abans dacabar-ho o anar de manera directa a comprovar la condici de la instrucci sense haver de passar per lordre done. Aquestes possibilitats ens les ofereixen les ordres continue (taula 26) i break (taula 27). Noms les podem utilitzar en les ordres while, until i for. Un bucle s una estructura repetitiva.
Taula 26. Format de l'ordre continue continue continue [n] Objectiu Saltar a la lnia on hi ha la condici de la instrucci repetitiva. El valor n representa un nombre que indica a quin nivell de bucle hem de buscar la condici. Quan no sindica n, sentn el valor du, s a dir, busca la condici en el mateix nivell! en que estem. Exemples de lordre i=1 while [ ${i} -le 5 ] do echo ${i} continue i=`expr ${i} + 1` done Resultat de lordre Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui ms petit o igual que 5 anir visualitzant-ne el contingut. Lordre continue envia la seqncia a la condici i com que sempre s ms petit que 5 estem en un bucle sense sortida. Lordre expr mai sexecuta.
Sistemes operatius
39
Taula 27. Format de l'ordre break break break [n] Objectiu Saltar a la lnia segent del bloc que forma la instrucci repetitiva. El valor n representa un nombre que indica a quin nivell de bucle hem de saltar. Quan no sindica n, sentn el valor du, s a dir, salta a lordre segent que forma el bloc. Exemples de lordre i=1 while [ ${i} -le 5 ] do echo ${i} break i=`expr ${i} + 1` done Resultat de lordre Sinicialitza la variable i a 1. Ja que el valor de la variable i s menor que 5, visualitza el seu contingut. Seguidament sexecuta lordre break que envia la seqncia a la segent ordre del bloc while.
Sistemes operatius
40
expr Exemples de lordre A=2 B=10 C=`expr $A \* $B` echo $C C=`expr 4 / 4` echo $C Exemple d'ulitzaci de l'ordre expr Dissenyem un gui anomenat nmeros que ens pregunti un nmero positiu i que ens tregui tots el nmeros que van de zero fins al nmero entrat incrementats de 2 en 2. #!/bin/sh # El nom del gui s: nmeros # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Treu el nmeros que van des de zero fins a un nmero incrementats de 2 en 2 #-------------------------bloc principal -------------------------numero=0 comptador=0 while [ "$numero" le 0 ] do echo -n "Has dentrar un nmero positiu:" read numero done while [ "$comptador" le $numero ] do echo ${comptador} comptador=`expr $comptador + 2` done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 #-------------fi---------Visualitza el resultat d1. Resultat de lordre Visualitza el resultat de 20.
Com en el cas dels guions, lies i altres estructures de caracterstiques semblants, es poden utilitzar les funcions per reduir la quantitat de codi i per evitar recordar ordres o seqncies dordres complicades. Abans de fer servir una funci del shell, cal definir-la. En la taula 29, teniu informaci sobre la manera de gestionar les funcions.
Sistemes operatius
41
Taula 29. Gesti de les funcions crear/cridar/eliminar funcions 1) Creaci de les funcions: Format 1: nom-funci () { llista-accions; } Format 2: nom_funci () { ordre(s) } Format 3: function nom_funci ( ) { ordre(s) } 2) Crida a funcions: Format 1: nom_funci Format 2 i 3: nom_funci argument1 argument2 ... argumentn 3) Eliminar funcions: unset f nom_funci Objectiu Definir, cridar i eliminar una funci. Exemples de lordre L () { ls l ; sleep 10 ; clear; } Resultat de lordre Definim una funci anomenada L. Aquesta funci visualitza els noms dels fitxers del lloc on som i espera 10 segons abans desborrar la pantalla.
Les funcions del shell tamb es poden crear en un gui i utilitzar-les en el gui mateix. En aquests casos les funcions shell shan de declarar abans del bloc principal del gui.
Quan dissenyem una funci, el shell la desa en la memria fins que sortim del shell. Per utilitzar una funci, cal escriure el nom de la funci seguida per qualsevol nombre de parmetres. En la taula 30, teniu informaci sobre la manera de cridar les funcions.
Taula 30. Cridar funcions nom_funci [arg1]...[argn] Format 1: nom_funci Format 2: nom_funci argument1 argument2...argumentn Objectiu Cridar una funci del shell amb la possibilitat de passar-li arguments. Aquests arguments sn gestionats de la mateixa manera que en cas de pas darguments a guions. Exemples de lordre escriure 34 67 Resultat de lordre Crida una funci anomenada escriure i li passa els arguments 34 i 67.
Qualsevol cosa que podem fer amb un gui podem fer-la amb una funci shell i viceversa. No obstant aix, hi ha algunes diferncies. Les funcions del shell sexecuten sempre dintre del seu propi entorn. Aix significa que les ordres duna funci poden afectar les variables, opcions, etc., del shell.
Sistemes operatius
42
El guions en canvi, no afecten lentorn del shell. A ms, el shell desa les funcions directament en memria, per aix les funcions shi executen ms rpidament que els guions. El shell pot executar una funci immediatament per per executar-la un gui ha de buscar el fitxer que cont el gui i llegir-lo. ! Com a norma general, les funcions del shell sn adequades per a coses que es fan servir sovint. Els guions, en canvi, sutilitzen ms en treballs poc freqents i tamb per a estructures amb un nombre elevat dinstruccions, ja que les funcions ocupen memria de lordinador.
Una funci del shell desapareix en el moment que deixem el shell en el qual havem definit la funci.
Les funcions sn locals en el shell on estan definides. Una funci mai s visible en un subshell o en el shell pare dun gui en qu ha estat definida, en altres paraules no existeix lordre export per a funcions.
Per manipular els parmetres posicionals passats a una funci durant la seva crida sutilitza el format $n (on n s un nmero que representa la posici).
Exemple de funcions Dissenyem un gui anomenat salutaci on apliquem el pas de parmetres a una funci. #!/bin/sh # El nom del gui s: salutaci # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Aplicaci de funcions amb pas de parmetres # -------------Bloc Funcions------------------------function Hola ( ) { echo "Hola $1" } #-----------Final Funcions-------------------------#-------------------------Bloc Principal -------------------------clear Hola Josep echo n "Prmer tecla." read tecla clear exit 0 #-------------------------Final Principal --------------------------
En executar el programa salutaci, largument Josep es passa a la funci i visualitza la paraula Josep. La variable $1 cont el valor posicional de Josep.
Les variables definides en un gui o funci sn globals, s a dir una vegada definides sn accessibles i modificables des de qualsevol lloc de la funci o del gui.
Sistemes operatius
43
Exemple de funcions amb variables globals Interpretar el resultat del segent gui #!/bin/sh # El nom del gui s: salutaci # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Aplicaci de funcions amb variables globals # -------------Bloc Funcions------------------------function aqu ( ) { on="Dins de la funci" } #-----------Final Funcions-------------------------#-------------------------Bloc Principal -------------------------clear on="En el gui" echo "$on" aqui echo "$on" echo n "Prmer tecla." read tecla clear exit 0 #-------------------------Final Principal --------------------------
Les funcions del shell poden retornar tamb valors destat igual que les ordres normals del sistema Unix. Per fer-ho, disposem de lordre return. En la taula 31, teniu informaci sobre la manera de retornar valors en una funci.
Taula 31. Format de l'ordre return return [valor] return [valor] Objectiu Retornar el valor de la funci del shell. Quan en una funci shell sespecifica lordre return, retorna immediatament fins i tot si hi ha ms ordres en la funci. La variable valor representa el valor que sha retornat. Exemples de lordre return 0 Exemple daplicaci de lordre return. Interpretar el funcionament del segent gui #!/bin/sh # El nom del gui s: salutaci # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Aplicaci de funcions amb retorn de valors # -------------Bloc Funcions------------------------editar () { vi $1 if [ "$?" ne 0 ] then return 1 else Resultat de lordre Surt de la funci i retorna el valor 0.
Sistemes operatius
44
return 0 fi } #-----------Final Funcions-------------------------#-------------------------Bloc Principal -------------------------clear editar /prova if [ "$?" eq 0 ] then echo "Ledici ha anat sense cap problema" else echo "Hi ha hagut problemes amb ledici del fitxer" fi echo n "Prmer tecla." read tecla clear exit 0 #-------------------------Final Principal --------------------------
Exemple daplicaci de lordre return en una funci dun gui Presentem la utilitzaci de lordre return en una funci dun gui. La paraula informtica no sescriu cap cop; en canvi, la paraula dilluns sescriu cinc vegades.
#!/bin/sh # El nom del gui s: retom # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Presenta la paraula dilluns cinc vegades, utilitzem lordre return # --------------------------------bloc de funcions--------------------visualitza () { echo $2 return 1 echo $1 } # -----------------------------Final Funcions------------------------# ---------------------------Bloc Principal--------------------------clear nombre=0 while test $nombre -lt 5 do visualitza informtica dilluns nombre= `expr $nombre + l` done echo -n "Final del procs. Premeu qualsevol tecla." read tecla clear exit 0 # -------------------------------Final Bloc principal-----------------
1.4.8. Pas de parmetres i la seva gesti en els guions del shell de Bourne
Les dades que necessita el gui o b les agafa del gui mateix o b fa servir la tcnica dentrada de dades per teclat (read). Hi ha una altra possibilitat que consisteix a passar les dades al gui escrivint al costat del nom del gui les dades que volem que utilitzi. Aix sha de fer en el mateix moment que executem el gui.
Sistemes operatius
45
Les dades que passem a un gui utilitzem la mateixa lnia que crida el gui sanomenen arguments o parmetres. Aix, podem parlar dargument1, argument2,...,argumentn, que corresponen al nom dels arguments segons la seva posici en la lnia del gui. Els parmetres han destar separats com a mnim per un espai. El nombre de parmetres que podem passar s illimitat, per desprs el gui per defecte noms podr gestionar els nou primers. El nom del gui correspon a largument zero (argument0). En la taula 32, teniu informaci sobre lexecuci dels guions amb pas de parmetres.
Taula 32. Execuci de guions amb arguments Execuci dels scripts amb arguments 1) intrpret_comandaments [opcions] /cam/gui argument1...argumentn 2) intrpret_comandaments [opcions] ./cam/gui argument1...argumentn 3) #!/bin/intrpret [opcions] ./cam/gui argument1...argumentn Objectiu Executar un gui amb pas de parmetres. 1) Teclegem en el smbol del prompt del sistema el nom del fitxer que gestiona lintrpret que volem utilitzar: sh (shell de Bourne), bash (shell de Bash), csh (shell de C), tcsh (shell de T) i el ksh (shell de Korn) i, seguidament especifiquem el cam i el nom del gui a executar amb els arguments que volem passar al gui. 2) Teclegem en el smbol del prompt del sistema el nom del fitxer que gestiona lintrpret que volem utilitzar: sh (shell de Bourne), bash (shell de Bash), csh (shell de C), tcsh (shell de T) i el ksh (shell de Korn). En una lnia diferent i en el smbol del prompt del sistema especifiquem el cam i el nom del gui a executar amb els arguments que volem passar al gui. 3) Afegim aquesta ordre com a primera lnia en el gui. En el smbol del prompt del sistema especifiquem el cam i el nom del gui a executar amb els arguments que volem passar al gui. Nota: el pas darguments pot fer-se des de la lnia del shell o des dun gui que crida a un altre gui. Exemples de lordre sh /alfa josep anna carles Resultat de lordre Executa el gui alfa utilitzant lintrpret sh. El gui rep els arguments josep anna i carles.
El nombre mxim darguments que pot gestionar un gui a la vegada sn nou. En un gui els arguments sidentifiquen mitjanant el smbol $ i un nombre (0...9), que indica la posici de largument en la lnia dordres. El format per recollir en un gui els arguments que se li passen s $nombre. En la taula 33, teniu informaci sobre la manera de fer referncia als arguments en un gui.
Taula 33. Fer referncia als arguments en un gui $n $n Objectiu Utilitzar en un gui els arguments passats. El valor mxim de n s 9 i el valor mnim 0. Exemples de lordre echo $2 Resultat de lordre Far leco de largument que correspon a la segona posici en la lnia dordres del gui.
Sistemes operatius
46
Exemple de pas d'arguments a un gui Fixeu-vos en aquest exemple: suposem que ens demanen que dissenyem un gui que visualitzi la informaci "sistemes informtics: Unix". Una possible manera de fer-ho seria passar aquesta informaci al gui en forma darguments. Aix la manera dexecutar el gui seria: nom_gui sistemes informtics: Unix El nom_gui correspon a largument0; sistemes, a largument1; informtics:, a largument2; i Unix, a largument3. Aix, si el gui sanomena pas, una possible estructura seria: #!/bin/sh # El nom del gui s: pas # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Exemple de pas de parmetres # ------------------------bloc principal -------------------------clear echo $1 $2$3 echo n "Prmer tecla." read tecla clear exit 0 # --------------------final----------------------------------------------
Per executar el gui anterior, cal escriure en la lnia dordres: pas sistemes informtics: Unix
Un problema que presenta el pas de parmetres s que un gui noms pot gestionar nou arguments com a mxim. Com podem resoldre el problema quan passem ms parmetres? La soluci est en lordre shift (taula 34).
Taula 34. Format de l'ordre shift shift shift [n] Objectiu Desplaar els parametres posicionals n llocs cap a lesquerra. El smbol n representa un nombre que indica el nombre de llocs que shan de moure cap a lesquerra els arguments. En el cas de no indicar-ne cap valor sagafa per defecte el valor du. Exemples de lordre shift 2 Resultat de lordre Desplaa els parmetres posicionals 2 llocs a lesquerra.
Exemple de passar qualsevol argument a un gui Suposem que tenim el gui imprimir, que ens dna la possibilitat dimprimir el contingut de qualsevol fitxer de tipus ASCII. Lestructura del gui s: #!/bin/sh # El nom del gui s: imprimir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Exemple de passar qualsevol nombre de parmetres # -----------------------------------------bloc principal -------------------------while test "$1" != "" do lpr $1 shift
Sistemes operatius
47
done echo -n "Final del procs. Premeu qualsevol tecla." read tecla clear exit 0 # --------------------------------------------------fi ---------------------------------------------------
sh ./imprimir a b c d e f g h i j k l m n o p q
Exemple dels fitxers /etc/profile i ~/.profile Aqu teniu uns exemples dels fitxers /etc/profile i ~/.profile
1) Fitxer: /etc/profile
2) Fitxer: ~.profile
Sistemes operatius
48
Taula 35. Format de l'ordre set set set opcions Objectiu Permet fer un seguiment de lexecuci dun gui. Les opcions sn activades quan van precedides del signe i anullades quan van amb el signe +. s convenient utilitzar aquesta ordre dins dels guions. Opcions: -x: visualitza cada ordre, les variables i el seu contingut. El resultat va precedit amb el smbol +. -v: visualitza cada lnia abans davaluar-la. Exemples de lordre set -x Resultat de lordre Activa el seguiment dun gui.
De vegades cal parar lexecuci dels guions per comprovar determinades situacions. Aix ho podem fer aplicant punts de parada, utilitzant lordre read. Finalment, en la taula 36 teniu un resum dels noms de les principals ordres que podeu utilitzar en el shell de Bourne.
Taula 36. Resum dels noms de les principals ordres del shell de Bourne Nom de lordre .nom_fitxer break case continue cd echo do done eval elif else esac exec exit export expr false fi for getopts hash if newgrp pwd read readonly return set Nom de lordre shift stop test times trap true type ulimit umask unset until wait while Nom de lordre
Sistemes operatius
49
pador. Bash s el shell per defecte en la majoria dels sistemes GNU/Linux, a ms de Mac OS X Tiger, i pot executar-se en la majoria dels sistemes operatius tipus Unix. ! La sintaxi de les ordres de Bourne s un subconjunt de la sintaxi del shell de Bash. La majoria del guions escrits pel shell de Bourne poden executarse en el shell de Bash sense cap canvi, amb lexcepci daquells guions que fan referncia a variables especials de Bourne o que utilitzen una ordre interna de Bourne. La sintaxi de les ordres de bash inclouen idees agafades del shell de Korn i el shell de C, com ledici de la lnia dordres, lhistorial dordres, la pila de directoris, les variables $RANDOM i $PPID i la sintaxi de substituci dordres POSIX: $(...). La sintaxi de bash t moltes extensions que no proporciona el shell de Bourne.
Versi de shell installada Si volem saber el shell que tenim installada podem utilitzar lordre: echo SHELL. Tamb podem saber tots els intrprets dordres que podem utilitzar en la distribuci dUnix que estem utilitzant a travs de lordre cat / etc/shells.
3) Utilitzaci de carcters especials: podem fer servir tots els metacarcters, com les dobles cometes (), les cometes senzilles (), laccent greu (`), el backslash (\), el dlar ($), la pipeline (|), i els canvis dadrea (>, <, >>, <>, &, <<). 4) En el shell de Bash tamb podem utilitzar els segents smbols com a patrons: *, ?, [valor1...valorn], [valor1-valorn], [!valor1...valorn], [!valor1valorn] , { }, i ~ (titlla). {}: el comod claus no estudia el nom dels fitxers existents, simplement amplia una paraula per cada una de les cadenes de carcters que
!!
Per estudiar la utilitzaci de carcters especials consulteu el subapartat Informaci general sobre el shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
50
cont. En la taula 38, teniu alguns exemples sobre la utilitzaci del comod {}. ~: el comod titlla (~) sutilitza per referir-se a un directori home dels usuaris. Per exemple, si utilitzem ~josep/prova.c el que succeeix s que ho interpreta com /home/josep/prova.c. Tamb podem utilitzar el comod titlla per referir-nos al nostre propi directori. Per fer-ho cal posar una barra (/) al comenament, com per exemple: ~/prova.c, que ho interpreta com a /home/josep/prova.c. En la taula 38, teniu un exemple sobre la utilitzaci del comodins ~. El significat dels altres comodins s el mateix que en el shell de Bourne.
Taula 38. Exemples dutilitzaci dels comodns {} i ~ Exemples dordres cd ~josep echo c{am, ontam}i ls *.{c, h} Resultat Ens permet desplaar-nos a /home/josep. Fa referncia a les paraules: cami i contami Permet visualitzar els noms del fitxers que tenen qualsevol nom i dextensi els carcters c o h.
!!
Per estudiar la utilitzaci de dels comodins consulteu el subapartat Informaci general sobre el shell de Bourne de lapartat El shell de Bourne.
5) Ordres simples. Les ordres simples funcionen de la mateixa manera que en el shell de Bourne. 6) Llistes dordres (;, &, && i ||). Tenen el mateix significat que en el shell de Bourne. 7) Agrupament dordres ((), {}). Tenen el mateix significat que en el shell de Bourne.
!!
Per estudiar les ordres simples, les llistes dordres i lagrupament dordres consulteu el subapartat Informaci general sobre el shell de Bourne de lapartat El shell de Bourne.
Una variable shell s un nom que t valors o a la qual sen poden assignar.
Sistemes operatius
51
Taula 39. Assignar informaci a una variable nom_variable=expressio nom_variable=expressio Objectiu Assignar un valor a una variable. Exemples de lordre NOM="Josep Mart Balmes" NUMERO=123 DIRECTORI=/usr/josep Resultat de lordre Assigna a la variable NOM la informaci de lexpressi. Assigna a la variable NUMERO el valor 123. Assigna a la variable DIRECTOR la informaci / usr/josep.
Format 1: A=5 B=4 ((C=A * B)) echo $C Format 2: declare i A=5 declare i B=4 declare i C A=5 B=4 ((C=A * B)) echo $C
El resultat ser: 20
Sistemes operatius
52
Taula 41. Gestionar el contingut d'una variable $nom_variable 1) $nom_variable 2) ${nom_variable} Objectiu 1) Gestionar el contingut duna variable utilitzant el nom especfic de la variable. 2) Gestionar el contingut duna variable utilitzant el nom especfic de la variable i afegint carcters. Exemples de lordre NOM=Josep Mas echo $NOM NUMERO=12.3 echo $NUMERO euros NOM="Josep Mart Balmes" echo $NOMbre NOM="Jos" echo ${NOM}ep Resultat de lordre Assigna a la variable NOM la informaci de lexpressi. Visualitza el contingut de la variable NOM. Assigna a la variable NUMERO el valor 12.3. Visualitza el contingut de la variable NUMERO i afegint la paraula euros. Donar un error ja que la variable NOMbre no existeix. Assigna a la variable NOM la informaci Jos. Visualitza el contingut de la variable NOM afegint la paraula ep (Josep).
En el shell de Bash, per visualitzar el contingut duna variable a ms de lordre echo podem utilitzar lordre printf (taula 42).
Taula 42. Format de l'ordre printf printf printf cadena_format [arguments] Objectiu Visualitzar i formatar el text i el contingut de les variables per pantalla. Cadena_format: sindica les especificacions del format. Han de comenar pel smbol %. %c: visualitza el primer carcter duna variable cadena. %d: visualitza nombre decimal.
Tipus de variables
No totes les variables que utilitzem en lentorn sn del mateix tipus. Les podem classificar de la manera segent: 1) Definides per lusuari. Sn variables creades per lusuari. Per gestionar-les shan de seguir els passos que acabem dindicar. Aquestes variables desapareixen en el moment que acaben una sessi en Unix o b quan nosaltres ho decidim.
Sistemes operatius
53
Lentorn s la zona disponible per part dun determinat usuari. Aquesta zona fa referncia a les variables que t assignades, les eines que pot utilitzar, els recursos disponibles, etc. 2) Definides pel sistema. El shell utilitza diverses variables (en la taula 43 teniu informaci sobre algunes daquestes variables del sistema) que sn creades i a les quals sassignen valors durant el procs de connexi. Tota la informaci que el sistema ens assigna sanomena entorn. Quan sinvoca el shell de connexi al sistema, aquest busca un entorn estndard proporcionat pel sistema i crea una nova variable shell amb el nom especificat i el valor indicat. Lentorn es pot modificar amb noves definicions en els fitxers .bash_profile (Unix) o utilitzant la lnia de la interfcie dusuari. Si no hi fem canvis, lentorn estndard es passar a qualsevol ordre executada pel shell o per qualsevol subshell.
Taula 43. Nom i contingut d'algunes variables del sistema Nom de variable PS1 PWD PS2 Descripci Aquesta variable cont la cadena primria del prompt que apareix quan el shell est esperant una ordre. Per defecte s el smbol $. Cont el nom del directori de treball. Cont la cadena del prompt secundari i surt quan el shell espera que vosaltres completeu una ordre que vreu comenar en la lnia anterior. Per defecte s el smbol >. Indica el directori de lusuari. Cont el nom del shell utilitzat per defecte. El valor daquesta variable ser /bin/bash si estem executant el shell de Bash. Cont el nom del lloc on est situada la nostra bstia de correu. Guarda el nombre de lnies i de columnes de la nostra terminal. Guarda el nmero de la versi del shell de Bash. Guarda el nom de lusuari del compte que estem utilitzant. Visualitza el contingut de la variable SHELL
Exemple ds de variables definides pel sistema Dissenyem un gui anomenat prova7 que presenti el nom de lusuari, lintrpret dordres utilitzat, el smbol del prompt principal i secundari, el directori de lusuari, els llocs on busca els programes executables i el lloc de la nostra bstia. Una soluci podria ser la segent: #!/bin/bash # El nom del gui s: prova7 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar el contingut de variables del sistema # *************bloc principal ***************** clear echo " El nom de lusuari s: $USER" echo " El shell utilitzat s: $SHELL" echo " El prompt principal s: $PS1" echo " El prompt secundari s: $PS2" echo " El directori dusuari s: $HOME" echo " Els directoris on Unix busca els programes executables sn: $PATH" echo " La bstia est situada a: $MAIL" sleep 10 clear exit 0 # ****************Final*************
Sistemes operatius
54
3) Variables especials. El shell de Bash utilitza el mateix format de variables especials que el shell Bourne. En la taula 44, teniu informaci sobre la utilitzaci de les variables especials.
Taula 44. Variables especials 0/1..9/#/*/?/$/!/@ Exemples de lordre echo $0 echo $1 echo $? Resultat de lordre Visualitza el nom del gui. Visualitza el contingut de largument 1 passat al gui. Visualitza el valor de lestat de sortida de lultima ordre executada.
!!
Per estudiar el funcionament de les variables especials consulteu el subapartat Gesti de variables en el shell de Bourne de lapartat El shell de Bourne.
Exemple ds de variables especials Dissenyem un gui anomenat prova8 que presenti el nom del gui, el nombre de parmetres passats i els seus noms, lestat de sortida i el PID del gui. Una soluci podria ser la segent: #!/bin/bash # El nom del gui s: prova8 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar el contingut de variables del sistema # *************bloc principal ***************** clear echo " El nom del gui s: ${0}" echo " El nombre de parmetres passats al gui sn: $#" echo " Els noms del parmetres passats sn : $*" echo " Lestat de sortida s: $? " echo " El PID del gui s: : $$" sleep 10 clear exit 0 # ****************Final*************
!!
El concepte de variables locals i globals en el shell de Bash s el mateix que en el shell de Bourne. Tamb sutilitza la mateixa ordre (export) per fer que una variable local sigui global.
Per estudiar el funcionament de les variables locals i globals consulteu el subapartat Gesti de variables en el shell de Bourne de lapartat El shell de Bourne.
Eliminar variables
De la mateixa manera que podem crear variables, tamb en qualsevol moment podem anullar-les sense haver dacabar una sessi en Unix. Lordre que ens permet fer aquestes funcions s unset.
Sistemes operatius
55
!!
Per estudiar el funcionament de les ordres set, env, unset i read consulteu el subapartat Gesti de variables en el shell de Bourne de lapartat El shell de Bourne.
Exemple d'entrada de dades en un gui Dissenyem un gui anomenat prova9 que ens pregunti el nom i cognoms. Seguidament ha de visualitzar la informaci entrada. #!/bin/bash # El nom del gui s: prova9 # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Pregunta el nom i cognoms duna persona i els visualitza en una lnia # -----------------bloc principal -------------------------clear echo -n "Quin s el teu nom?:" read nom . echo -n "i els teus dos cognoms?:" read cognom 1 cognom2 echo El meu nom i cognoms sn: $nom, $cognom1, $cognom2" sleep 10 clear # ----------------fi--------------------
!!
Per estudiar el funcionament de lordre exit consulteu el subapartat Acabar un shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
56
Taula 45. Format de les condicions test/[ ]/(( ))/[[ ]] test condici [ condici ] ((condici)) [[ condici ]] Objectiu Comprovar el format de la condici. Retorna un valor destat que indica si el format de la condici s veritat o fals. Cal deixar un espai desprs del smbol [, i abans del smbol ]. Condici: 1) Avaluar trajectries: a) -d fitxer: retorna veritat si el fitxer s un directori. b) -e fitxer: retorna veritat si existeix el fitxer. c) -r fitxer: retorna veritat si el fitxer existeix i t el perms de lectura. d) -w fitxer: retorna veritat si el fitxer existeix i t el perms descriptura. e) -x fitxer: retorna veritat si el fitxer existeix i t el perms dexecuci. f) -c fitxer: retorna veritat si el fitxer existeix i s de carcters. g) -b fitxer: retorna veritat si el fitxer existeix i s de blocs. h) -O fitxer: retorna veritat si el fitxer existeix i el propietari s lusuari del procs. 2) Avaluar lantiguitat dels fitxers: a) fitxerl -ot fitxer2: retorna veritat si el fitxer1 s ms antic que el fitxer2 o el fitxer2 existeix i el fitxer1 no. b) fitxerl -nt fitxer2: retorna veritat si el fitxer1 s ms nou que el fitxer2 o el fitxer1 existeix i el fitxer2 no. 3) Comparar cadenes: a) cadena1 = cadena2: retorna veritat si les dues cadenes sn iguals. b) cadena1 != cadena2: retorna veritat si les dues cadenes no sn iguals. c) cadena1 < cadena2: retorna veritat si la cadena1 s abans que la cadena2 segons la taula ASCII. d) cadena1 > cadena2: retorna veritat si la cadena1 s desprs que la cadena2 segons la taula ASCII. Cal indicar que abans i desprs dels operadors cal deixar un espai. 4) Avaluar si una cadena s nulla: a) -z cadena: retorna veritat si la longitud de la cadena s zero. b) -n cadena: retorna veritat si la longitud de la cadena no s zero. 5) Comparar valors numrics: a) valor1 -eq valor2: retorna veritat si valor1 i valor2 sn iguals. b) valor1 -ne valor2: retorna veritat si valor1 i valor2 no sn iguals. c) valor1 -gt valor2: retorna veritat si valor1 s ms gran que el valor2. d) valor1 -ge valor2: retorna veritat si valor1 s ms gran o igual que el valor2. e) valor1 -lt valor2: retorna veritat si valor1 s ms petit que el valor2. f) valor1 -le valor2: retorna veritat si valor1 s ms petit o igual que elvalor2. Dins de (( )) i [[ ]] , podem utilitzar els operadors: = =, >, <, >=, <=, !=, !, && i ||. 6) Operadors lgics: a) ! expressio: retorna veritat si el resutat de lexpressi s falsa. b) expressio1 -a expressio2: retorna veritat si totes les expressions sn veritat. c) expressio1 -o expressio2: retorna veritat si alguna de les expressions s veritat. d) [ condici1 ] && [ condici2 ]: retorna veritat si totes les condicions sn veritat. e) [ condici1 ] || [ condici2 ]: retorna veritat si alguna de les condicions s veritat. Nota: dins dels [ ], hem dutilitzar els operadors a (and) i o (or). Exemples de lordre test 100 eq 100 echo $? test 100 eq 50 echo $? [ "${HOME} " = /home/josep ] echo $? [ "Hola" = "mn" ] echo $? Retorna 1 ja que s falsa la condici. Retorna 0 ja que s veritat la condici. Retorna 1 ja que s falsa la condici. Resultat de lordre Retorna 0 ja que s veritat la condici.
Sistemes operatius
57
test/[ ]/(( ))/[[ ]] Exemples de lordre PROVA="" [ $PROVA ] echo $? NUM=10 [ $NUM gt 10 ] echo $? [ -d josep ] echo $? [ -f prova -a -x prova ] echo $? [ -c users -o -d directori ] echo $? ((3= =5)) echo $? A=josep ((A= =josep)) a=20 [[ a = = 6 ]] Retorna 1 ja que s falsa la condici. Retorna 0 ja que s veritat la condici. Retorna 0 ja que s veritat una o totes les condicions. Retorna 1 ja que s falsa la condici. Retorna 0 ja que s veritat les condicions. Retorna 0 ja que s veritat la condici. Retorna 1 ja que la condici s falsa. Resultat de lordre Retorna 1 ja que la variable est buida.
Estructures alternatives
En el shell de Bash podem utilitzar les estructures de control anomenades alternatives. Els conceptes aplicats al shell de Bourne es poden aplicar tamb en el shell de Bash. Les ordres ms representatives daquest tipus destructures sn les segents: if i case.
Exemple destructures alternatives Dissenyem un gui anomenat positiu, que pregunti a lusuari un nombre. El gui ens ha de dir si el nombre entrat s positiu. #!/bin/bash # El nom del gui s: positiu # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Permet saber si un nombre enter s positiu # ----------------------bloc principal -------------------------clear echo -n "Dnam un nombre:" read nombre if [ $nombre -gt 0 ] then echo "El nombre entrat: $nombre s positiu" else echo "El nombre entrat: $nombre no s positiu" fi echo -n "Prmer qualsevol tecla per a continuar." read tecla clear exit 0 # -------------------------fi----------------------------
!!
Per estudiar les estructures alternatives consulteu el subapartat Estructures de control del shell de Bourne de lapartat El shell de Bourne.
Estructures repetitives
En el shell de Bash tamb podem utilitzar les estructures de control que sanomenen repetitives.
Sistemes operatius
58
Una estructura repetitiva s un conjunt daccions que es van repetint mentre es compleixen determinades condicions.
Dintre daquest grup podem trobar com a ordres ms representatives les segents: while, until i for.
Control de bucles
En determinats moments podem necessitar sortir dels bucles abans dacabar-ho o anar de manera directa a comprovar la condici de la instrucci sense haver de passar per lordre done. Aquestes possibilitats ens les ofereixen les ordres break i continue. Noms les podem utilitzar en les ordres while, until i for.
!!
Per estudiar el funcionament de les ordres while, until, for, break i continue consulteu el subapartat Estructures de control del shell de Bourne de lapartat El shell de Bourne.
En el shell de Bash, podem assignar atributs a les variables mitjanant lordre declare.
!!
(( expressi )) i [[ expressi ]]. En la taula 47, teniu informaci sobre les ordres (()) i [[ ]].
Taula 47. Format per calcular expressions (( ))/[[ ]] (( expressi )) [[ expressi ]]
Sistemes operatius
59
(( ))/[[ ]] Objectiu Calcular el valor de lexpressi. Operadors: +, -, *, /, %. ((variable=variable operador variable)) ((x++)): incrementa el valor de la variable x en 1. ((x--)): decrementa el valor de la variable x en 1. ((x+=valor)): suma al contingut de la variable x, el valor i guarda el resultat en x. ((x-=valor)): resta al contingut de la variable x, el valor i guarda el resultat en x. ((x*=valor)): multiplica al contingut de la variable x, el valor i guarda el resultat en x. ((x/=valor): divideix al contingut de la variable x, el valor i guarda el resultat en x. ((x%=valor)): agafa la resta de la divisi entera entre el contingut de la variable x i el valor, i guarda el resultat en x. Exemples de lordre VAR=55 ((VAR=VAR+1)) echo $VAR VAR=55 ((++VAR )) echo $VAR VAR=55 ((VAR++ )) echo $VAR echo $[[ VAR*22 ] ] echo $((VAR*22)) ((a=3+8)) echo $a a=20 ((b=a+10)) echo $b ((a=(3+5)/8)) echo $a [[ a=5+7 ]] echo $a A=12 echo $[[ B=A+3 ]] Visualitza el resultat de 15. Visualitza el resultat de 12. Visualitza el resultat d1. Visualitza el resultat de 30. Visualitza el resultat de multiplicar el contingut de la variable per 22. Visualitza el resultat de multiplicar el contingut de la variable per 22. Visualitza el resultat d11. Suma un a la variable VAR. Suma un a la variable VAR. Resultat de lordre Suma un a la variable VAR. Observeu que no sutilitza el carcter $.
El format dexpressi aritmtica (( )) es pot tamb utilitzar en les diferents sentncies de control de flux, a ms de les ordres test i [ ]. En la taula 48, teniu informaci sobre la utilitzaci del smbol (()) en les estructures de control.
Taula 48. Format de les estructures de control if / for / while if ((expressi)) then acci(ns) fi while ((expressi)) do acci(ns) done done for (( inicialitzaci; condici; actualitzaci)) do acci(ns)
En lexpressi podem utilitzar els operadors: = =, >, <, >=, <=, !=, !, && i ||.
Sistemes operatius
60
if / for / while Objectiu Calcular el valor de lexpressi i actuar en funci del resultat. Exemples de lordre echo n "Entreu un nmero:" read numero for ((i=0; i<=10; i++)) do echo $ i done Resultat de lordre Visualitza tots el valors que van des de 0 a 10.
Exemple d'estructures repetitives Dissenyem un gui anomenat repetir que ens pregunti nombres fins que entrem el nombre -1. #!/bin/bash # El nom del gui s: repetir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Ens pregunta nombres fins que hem entrat el -l # -----------------------bloc principal -------------------------declare i nombre=0 while ((nombre != -1)) do clear echo -n "Escriu un nombre:" read nombre done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 # -------------------fi----------------------------Exemple d'estructures repetitives Dissenyem un gui anomenat repetir que ens pregunti nombres fins que entrem el nombre -1, utilitzant lestructura until. Podria dissenyar-se de la manera segent: #!/bin/bash # El nom del gui s: repetir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Ens pregunta nombres fins que hem entrat el -l # bloc principal -------------------------declare i nombre=0 until ((nombre = = -1)) do clear echo -n "Escriu un nombre:" read nombre done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 # ----------------fi--------------------
Sistemes operatius
61
Exemple d'estructures repetitives Dissenyem un gui anomenat per, que escrigui cinc vegades la paraula informtica. #!/bin/bash # El nom del gui s: per # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Escriu la paraula Informtica 5 vegades # --------------------bloc principal------------------------------clear for ((j=0; j<=5; j++)) do echo "Informtica" done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 #------------fi------------
Exemple d'estructures repetitives Dissenyeu un gui anomenat nmeros que ens pregunti un nmero positiu i que ens tregui tots el nmeros que van de zero fins al nmero entrat incrementats de 2 en 2. #!/bin/bash # El nom del gui s: nmeros # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Treu el nmeros que van des de zero fins a un nmero incrementats de 2 en 2 #-------------------------bloc principal -------------------------declare i numero=0 declare i comptador=0 while ((numero <= 0)) do echo -n "Has dentrar un nmero positiu:" read numero done while ((comptador <= numero)) do echo ${comptador} let comptador=comptador + 2 done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 #-------------fi----------
Un array s una variable que en un mateix moment hi podem guardar diferents tipus dinformacions. Sutilitza un ndex per indicar el lloc on situem la informaci dins de la variable. Aquest ndex comena pel valor zero.
Sistemes operatius
62
Actualment bash noms suporta treballar amb arrays unidimensionals (un nic ndex).
!!
Per estudiar la creaci, crides, eliminaci i retorn de valors de les funcions consulteu el subapartat Funcions del shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
63
local Exemples de lordre #!/bin/bash function aqu ( ) { local on="Dins de la funci" soc=josep } on="En el gui" echo "$on" aqui echo "$on" echo "Sc el ${soc}" exit 0 Exemple daplicaci de funcions en un gui Apliquem les funcions en un gui. Suposem que tenim el gui segent anomenat funci. #!/bin/bash # El nom del gui s: funci # La data de creaci s: 18-05-07 # La persona creadora del gui s: jee # Presenta la paraula informtica 5 vegades utilitzant funcions # ------------------------------bloc funci---------------------------------------------visualitza () { echo $1 } # -------------------------------final funci---------------------------------------------# -------------------------------bloc principal-----------------------------------------clear declare i nombre=0 while ((nombre <5 )) do visualitza informtica ((nombre++)) done echo n "Prmer tecla." read tecla clear exit 0 # ----------------------------final bloc----------------------------------------------------------Exemple dutilitzaci de lordre return Presentem la utilitzaci de lordre return en una funci dun gui. La paraula informtica no sescriu cap cop; en canvi, la paraula dilluns sescriu cinc vegades. #!/bin/bash # El nom del gui s: retorn # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Presenta la paraula dilluns cinc vegades, utilitzem lordre return # --------------------------------bloc de funcions--------------------visualitza () { echo $2 return 1 echo $1 } # -----------------------------Final Funcions------------------------# ---------------------------Bloc Principal--------------------------clear declare i nombre=0 while ((nombre < 5 )) Resultat de lordre En executar aqui, obtenim: En el gui Dins de la funci En el gui Sc el josep
Sistemes operatius
64
do visualitza informtica dilluns ((nombre++)) done echo -n "Final del procs. Premeu qualsevol tecla." read tecla clear exit 0 # -------------------------------Final Bloc principal-----------------
1.5.8. Pas de parmetres i la seva gesti en els guions del shell de Bash
El funcionament del pas de parmetres en el shell de Bash s el mateix que en el cas del shell de Bourne.
Exemple de pas d'arguments a un gui Fixeu-vos en aquest exemple: suposem que ens demanen que dissenyem un gui que visualitzi la informaci "sistemes informtics: Unix". Una possible manera de fer-ho seria passar aquesta informaci al gui en forma darguments. Aix la manera dexecutar el gui seria: nom_gui sistemes informtics: Unix El nom_gui correspon a largument0; sistemes, a largument1; informtics :, a largument2; i Unix, a largument3. Aix, si el gui sanomena pas, una possible estructura seria: #!/bin/bash # El nom del gui s: pas # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Exemple de pas de parmetres # ------------------------bloc principal -------------------------clear echo $1 $2$3 echo n "Prmer tecla." read tecla clear exit 0 # --------------------final---------------------------------------------Per executar el gui anterior, cal escriure en la lnia dordres: pas sistemes informtics: Unix Exemple de pas d'arguments a un gui Suposem que tenim el gui imprimir, que ens dna la possibilitat dimprimir el contingut de qualsevol fitxer de tipus ASCII. Lestructura del fitxer s: #!/bin/bash # El nom del gui s: imprimir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Exemple de passar qualsevol nombre de parmetres # -----------------------------------------bloc principal -------------------------while test "$1" != "" do lpr $1 shift done echo -n "Final del procs. Premeu qualsevol tecla." read tecla
!!
Per estudiar el pas de parmetres en el shell de Bash consulteu el subapartat Pas de parmetres i la seva gesti en els guions del shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
65
clear exit 0 # --------------------------------------------------fi --------------------------------------------------La manera dexecutar el gui podria ser: bash ./imprimir a b c d e f g h i j k l m n o p q
.bashrc s llegit quan lusuari arrenca un subshell, escrivint per exemple bash en la lnia dordres. Si lusuari necessita les mateixes ordres tant en lentrada al sistema com per executar un subshell podem afegir lordre segent en el fitxer .bash_profile: source .bashrc.
Exemple de fitxer ~/.bashrc Aqu teniu un exemple del contingut del fitxer ~/.bashrc: # .bashrc # Especificar lies i funcions
Sistemes operatius
66
alias ll="ls -l --color" alias lal="ls -la --color" alias faq="cd /home/rafael/EL_RINCON/FAQ/" alias php="cd /home/rafael/EL_RINCON/PHP/" # Global definicions if [ -f /etc/bashrc ]; then . /etc/bashrc fi
.bash_logout s el fitxer executat per bash, quan sortim del sistema. Podem definir, per exemple que sesborrin els fitxers temporals creats en la nostra ltima sessi o registrar el tems que hem estat utilitzant el sistema. Si .bash_logout no existeix cap ordre ser executat a la nostra sortida.
Exemple de fitxer ~/.bash_logout Aqu teniu un exemple del contingut del fitxer ~/.bash_logout: # ~/.bash_logout clear
De vegades cal parar lexecuci dels guions per comprovar determinades situacions. Aix ho podem fer aplicant punts de parada, utilitzant lordre read.
Sistemes operatius
67
Finalment, en la taula 52 teniu els noms de les principals ordres que podeu utilitzar en el shell de Bash.
Taula 52. Resum dels noms de les principals ordres del shell de Bash Nom de lordre alias bg bind break builtin case cd command continue declare dirs echo enable eval exec exit export fc fg for getopts hash help history jobs kill let local logout printf pwd read readonly return Nom de lordre set shift shopt source suspend set times trap type typeset ulimit umask unalias unset wait while Nom de lordre
Sistemes operatius
68
2. El shell de C i el shell de T
El shell de C i els shell de T estan molt relacionats entre ells i tenen moltes similituds amb el llenguatge de programaci anomenat C, que avui dia sutilitza en un percentatge molt elevat en el disseny daplicacions informtiques. Ambds shells tenen moltes similituds. Principalment el shell C, per la seva similitud en determinats aspectes amb el llenguatge de programaci C, l'utilitzen molt en l'actualitat els administradors de sistemes informtics per dissenyar utilitats que ajudin a fer la gesti del sistema informtic una mica ms fcil.
Comparaci del shell de C i el shell de Bourne El shell de C sel considera ms idoni per a programadors que el shell de Bourne. El shell de C t algunes caracterstiques que no t el de Bourne com sn ledici dordres, lhistorial, la creaci dlies, els arrays, la disponibilitat de poder realitzar operacions matemtiques sense necessitat de fer crides a programes externs, la utilitzaci de parntesis per construir operacions condicionals, la manera dassignar valors a les variables, etc.
Versi de shell installada Si volem saber el shell que tenim installat podem utilitzar lordre: echo SHELL. Tamb podem saber tots els intrprets dordres que podem utilitzar en la distribuci dUnix que estem utilitzant a travs de lordre cat / etc/shells.
!!
Per estudiar els comentaris consulteu el subapartat Informaci general sobre el shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
69
Taula 53. Manera d'executar un gui i posar comentaris dins del gui Exemples dordres #! /bin/csh o #!/bin/tcsh # El nom del gui s: prova Resultat Quan sexecuta aquest gui, sindica que el shell ha dutilitzar el shell de C (csh) o de T (tcsh). Aix s una lnia de comentaris.
3) Utilitzaci de carcters especials: podem fer servir tots els metacarcters, com les dobles cometes ("), les cometes senzilles (), laccent greu (`), el backslash (\), el dlar ($), la pipeline (|), i els canvis dadrea (>, <, >>, <>, &, <<). 4) En els shells de C i de T, tamb podem utilitzar els segents smbols com a patrons: *, ?, [valor1...valorn], [valor1-valorn], [!valor1...valorn], [!valor1-valorn] , { }, i ~ (titlla). 5) Ordres simples. Les ordres simples funcionen de la mateixa manera que en el shell de Bourne. 6) Llistes dordres (;, &, && i ||). Tenen el mateix significat que en el shell de Bourne. 7) Agrupament dordres ((), {}). Tenen el mateix significat que en el shell de Bourne. 8) Historial de les ordres. Una de les diferncies amb el shell de Bourne s la possibilitat de disposar dun historial de les ordres que utilitzem, perqu aix podem repetir qualsevol de les ordres duna manera ms fcil. Per activar aquesta funci, necessitem la variable history (la versi daquesta ordre en el shell de T dna ms possibilitats que la mateixa ordre del shell de C). Aquesta variable desa el nombre mxim dordres que podem tenir en lhistorial. En la taula 54, podeu veure la manera dinicialitzar la variable history.
Taula 54. Format de l'ordre history history set history = valor Objectiu Inicialitzar la variable history amb el valor. Exemples de lordre set history = 20 Resultat de lordre Inicialitza la variable history. Aix indica que com a mxim podrem guardar 20 ordres en lhistorial.
!!
Per estudiar la utilitzaci de carcters especials, patrons, ordres simples, llistes dordres i agrupament dordres, consulteu el subapartat Informaci general sobre el shell de Bourne de lapartat El shell de Bourne.
Una vegada hem inicialitzat la variable history podem fer les accions que sindiquen en la taula 55.
Sistemes operatius
70
Taula 55. Accions a partir de l'odre history Format history !! !n !-n Acci Presenta les ltimes ordres executades amb un nmero dordre. Executa lltima ordre. Executa lordre indicada pel nombre n. Indica lordre situada n llocs abans de lactual.
9) Definici i utilitzaci dlies. Un lies s el nom que sassigna a una ordre o a un conjunt dordres. Escrivint el nom de llies en la lnia dordres executar les ordres que el formen. En la taula 56, teniu informaci sobre el funcionament de lordre alias.
Taula 56. Format de l'ordre alias i unalias alias/unalias 1) alias 2) alias nom 3) alias nom llista_ordres 4) unalias nom Objectiu 1: visualitzar tots els lies. 2: permet veure el contingut de nom. 3: permet crear un lies. 4: unalias ens permet anullar qualsevol lies creat. Exemples de lordre alias unalias fita alias dir clear ; ls -1 dir alias dir Resultat de lordre Visualitza els lies. Elimina llies fita. Crea un lies anomenat dir, que cont les ordres clear i ls l. Executar les ordres clear i ls l. Visualitza el contingut de llies anomenat dir.
Sistemes operatius
71
set Objectiu 1: assignar un valor a una variable. 2: visualitzar les variables de lentorn i els seus valors. 3: assignar diferents valors una variable; aquestes variables sanomenen arrays. 4: eliminar una variable. Exemples de lordre set nom = "Josep Mart Balmes" set nom = informtica set dies = (dilluns dimarts dimecres ) set dies[2] = dimecres unset nom Resultat de lordre Assigna a la variable nom la informaci de lexpressi. Assigna a la variable nom la paraula informtica. Assigna a la variable dies els valors de dilluns, dimarts i dimecres. Assigna a la variable dies el valor de dimecres a la posici 2. Elimina la variable nom.
En el cas de variables tipus numric podem utilitzar el smbol @ per definir les variables numriques. En la taula 58, teniu informaci sobre el funcionament de lordre @.
Taula 58. Format de l'ordre @ @ 1) @ nom_variable = expressi ; @ nom_variable[ndex] = expressi 2) @ Objectiu 1: inicialitzar una variable numrica amb el resultat de lexpressi. En lexpressi podem utilitzar els operadors +, -, *, / . 2: presentar el nom i el contingut de totes les variables de lentorn. Exemples de lordre @ numero = 20 @ @ vector[3] = 4 @ comptador = 0 Resultat de lordre Crea una variable numrica anomenada numero amb el valor de 20. Visualitza els valors de totes les variables. Assigna el valor de 4 a la variable vector en la tercera posici. Crea la variable numrica anomenada comptador i li assigna el valor de 0.
Amb les variables numriques podem fer les operacions que sindiquen en la taula 59.
Taula 59. Format dels operadors amb variables numriques Operadors ++ Significat Incrementa d1 el valor de variable. Operadors -+= valor -= valor Significat Disminueix el valor de variable en una unitat. Suma el valor a la variable. Resta el valor a la variable. @ cont - @ cont += 3 @ cont -= 3 @ cont ++ Exemple
Exemple
Sistemes operatius
72
Significat Multiplica el valor a la variable. Divideix la variable pel valor. Guarda la resta de la divisi entera entre la variable i el valor. Calcula la potncia de la variable elevada al valor.
En els shells de C i de T, tamb podem utilitzar variables unidimensionals, s a dir, variables tipus vector o array duna dimensi (utilitza un nic ndex).
Variables unidimensional Una variable unidimensional s aquella que amb un mateix nom pot desar diferents valors i que podem gestionar-los en qualsevol moment.
En els shells de C i de T, per visualitzar el contingut duna variable podem utilitzar lordre echo que t el mateix significat que en el shell de Bourne.
!!
Per estudiar lordre echo consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
Tipus de variables
No totes les variables que utilitzem en lentorn sn del mateix tipus. Les podem classificar de la manera segent: 1) Definides per lusuari. Sn variables creades per lusuari. Per gestionar-les shan de seguir els passos que acabem dindicar. Aquestes variables desapareixen en el moment que acaben una sessi en Unix o b quan nosaltres ho decidim.
Sistemes operatius
73
Lentorn s la zona disponible per part dun determinat usuari. Aquesta zona fa referncia a les variables que t assignades, les eines que pot utilitzar, els recursos disponibles, etc. 2) Definides pel sistema. El shell utilitza diverses variables que sn creades i a les quals sassignen valors durant el procs de connexi. Tota la informaci que el sistema ens assigna sanomena entorn. Quan sinvoca el shell de connexi al sistema, aquest busca un entorn estndard proporcionat pel sistema i crea una nova variable shell amb el nom especificat i el valor indicat. Lentorn es pot modificar amb noves definicions en els fitxers .cshrc (shell de C) i .tcshrc(shell de T) o utilitzant la lnia de la interfcie dusuari. Si no hi fem canvis, lentorn estndard es passar a qualsevol ordre executada pel shell o per qualsevol subshell. a) Variables dels shells de C i de T. En la taula 61, teniu informaci sobre algunes variables del sistema en els shells de C i de T.
Taula 61. Nom i contingut d'algunes variables del sistema Nom de variable argv cdpath history home path prompt shell user status mail Descripci s una variable unidimensional que guarda els noms dels arguments dun shell. Desa el lloc on sha danar quan sexecuta lordre cd. Guarda les ordres executades. Indica el directori de lusuari. Indica el lloc on shan danar a buscar els fitxers executables. Cont el format del prompt. Indica el lloc de lintrpret dordres. Fa referncia a lusuari. Desa el valor destat de lltima ordre executada. Cont el nom del lloc on est situada la nostra bstia de correu.
b) Variables del shell de T. En el shell de T podem destacar les segents variables: correct, dirsfile, edit, gid, group, listjobs, loginsh, logout, nobeep, prompt2, prompt3, tcsh, tty, uid, version, who, etc.
Exemple de visualitzaci del contingut d'algunes variables del sistema Dissenyem un gui utilitzant el shell de C, anomenat prova10 que presenti el nom de lusuari, lintrpret dordres utilitzat, el smbol del prompt principal, el directori de lusuari, els llocs on busca els programes executables i el lloc de la nostra bstia. Una soluci podria ser la segent:
!!
Per estudiar el funcionament de les variables especials consulteu el subapartat Gesti de variables en el shell de Bourne de lapartat El shell de Bourne.
3) Variables especials. En els shells de C i de T, podem utilitzar com a variables especials les segents: #, n, * i $. El significat daquestes variables s el mateix que en el shell de Bourne. Hi ha, per, dos formats nous de variables especials que podem utilitzar. Les podeu veure en la taula 62.
Sistemes operatius
74
#!/bin/csh # El nom del gui s: prova10 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar el contingut de variables del sistema # *************bloc principal ***************** clear echo " El nom de lusuari s: $user" echo " El shell utilitzat s: $shell" echo " El prompt principal s: $prompt" echo " El directori dusuari s: $home" echo " Els directoris on Unix busca els programes executables sn: $path" echo " La bstia est situada en: $mail" sleep 10 clear exit 0 # ****************Final************* Taula 62. Variables especials #nom_variable ?nom_variable < 1) #nom_variable 2) ?nom_variable 3) < Objectiu 1: fa referncia al nombre de parmetres de la variable. 2: retorna 0 si la variable no ha estat creada i 1 si est creada. 3: sutilitza per entrar dades des de teclat. Exemples de lordre echo $#variable echo $1 echo $?variable set valor = $< Resultat de lordre Visualitza el nombre de parmetres de la variable Visualitza el contingut de largument 1 passat al gui. Retorna 0 si la variable no ha estat creada i 1 si est creada. Tot el que teclegem es guarda en la variable valor (s equivalent a lordre read en el shell de Bourne i Bash). Sn equivalents i visualitzen el nombre de parmetres passats a un gui.
Exemple de visualitzaci de variables del sistema Dissenyem un gui anomenat prova11 utilizant el shell de T, que presenti el nom del gui, el nombre de parmetres passats i els seus noms, lestat de sortida i el PID del gui. Una soluci podria ser la segent: #!/bin/tcsh # El nom del gui s: prova11 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar el contingut de variables del sistema # *************bloc principal ***************** clear echo " El nom del gui s: ${0}" echo " El nombre de parmetres passats al gui sn: $#argv" echo " Els noms del parmetres passats sn : $*" echo " Lestat de sortida s: $status" echo " El PID del gui s: : $$" sleep 10 clear exit 0 # ****************Final*************
Sistemes operatius
75
!!
Per estudiar el funcionament de les variables locals i globals en el shell de C consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
Visualitzaci de les variables Sempre que vulguem podem veure el nom i continguts de totes les variables que en aquells moments t definides lentorn del sistema, podem utilitzar les ordres set, o setenv.
Lordre set en el shell de T permet ms opcions que la mateixa ordre del shell de C.
Eliminar variables
De la mateixa manera que podem crear variables, tamb en qualsevol moment podem anullar-les sense haver dacabar una sessi en Unix. Lordre que ens permet fer aquestes funcions s unset. Tamb podem utilitzar lordre unsetenv (taula 64).
Taula 64. Format de l'ordre unsetenv unsetenv unsetenv nom_variable Objectiu Eliminar variables de lentorn. Exemples de lordre unsetenv path Resultat de lordre Elimina la variable path.
!!
Per estudiar el funcionament de les ordres set i unset consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
Entrada de dades en una variable shell La variable $< (vegeu el seu funcionament en la taula 62) ens permet entrar dades en les variables utilitzant lentrada estndard (teclat).
Exemple d'entrada de dades per teclat Dissenyem un gui anomenat prova12 utilitzant el shell de T, que ens pregunti el nom i cognoms, seguidament ha de visualitzar la informaci entrada. #!/bin/tcsh # El nom del gui s: prova12 # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Pregunta el nom i cognoms duna persona i els visualitza en una lnia
!!
Per estudiar el funcionament de lordre $< consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
76
# -----------------bloc principal -------------------------clear echo -n "Quin s el teu nom?:" set nom="$<" . echo -n "i el teu primer cognom?:" set cognom1="$<" echo -n "i el teu segon cognom?: " set cognom2="$<" echo El meu nom i cognoms sn: $nom, $cognom1, $cognom2" sleep 10 clear # ----------------fi--------------------
!!
Per estudiar el funcionament de lordre exit consulteu el subapartat Acabar un shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
77
() 3) Comparar cadenes: a) cadena1 == cadena2: retorna veritat si les dues cadenes sn iguals. b) cadena1 != cadena2: retorna veritat si les dues cadenes no sn iguals. c) cadena1 < cadena2: retorna veritat si la cadena1 s abans que la cadena2 segons la taula ASCII. d) cadena1 > cadena2: retorna veritat si la cadena1 s desprs que la cadena2 segons la taula ASCII. Cal indicar que abans i desprs dels operadors cal deixar un espai. 4) Avaluar si una cadena s nulla: a) -z cadena: retorna veritat si la longitud de la cadena s zero. 5) Comparar valors numrics: a) valor1 = = valor2: retorna veritat si valor1 i valor2 sn iguals. b) valor1 != valor2: retorna veritat si valor1 i valor2 no sn iguals. c) valor1 > valor2: retorna veritat si valor1 s ms gran que el valor2. d) valor1 < valor2: retorna veritat si valor1 s ms gran o igual que el valor2. e) valor1 <= valor2: retorna veritat si valor1 s ms petit que el valor2. f) valor1 >= valor2: retorna veritat si valor1 s ms petit o igual que el valor2. g) valor1 <> valor2: retorna veritat si valor1 s diferent del valor2. 6) Operadors lgics: a) ! expressi: retorna veritat si el resultat de lexpressi s falsa. b) condici1 && condici2: retorna veritat si totes les condicions sn veritat. c) condici1 || condici2: retorna veritat si alguna de les condicions s veritat. Exemples de lordre ( 100 = = 100 ) echo $status ( 100 < 50 ) echo $status ( "$home" = = /home/josep ) echo $status ( "Hola" = = "mn" ] echo $status PROVA="" $PROVA echo $status @ num = 10 ( $num > 10 ) echo $status ( -d josep ) echo $status ( -f prova && -x prova ) echo $status ( -c users || -d directori ) echo $? ( ! -e pepe ) echo $status Retorna 0 ja que s veritat una o totes les condicions. Retorna 0 ja que s veritat la condici. Retorna 0 ja que sn veritat les condicions. Retorna 0 ja que s veritat la condici. Retorna 1 ja que la condici s falsa. Retorna 1 ja que la variable est buida. Retorna 1 ja que s falsa la condici. Retorna 0 ja que s veritat la condici. Retorna 1 ja que s falsa la condici. Resultat de lordre Retorna 0 ja que s veritat la condici.
Estructures alternatives
En el shells de C i T, podem utilitzar les estructures de control anomenades alternatives. Les ordres ms representatives daquest tipus destructures sn les ordres if i switch: 1) if. Aquesta estructura alternativa if, t diversos formats: if-then-endif (taula 66) i if-then-else-endif (taula 67).
!!
Per estudiar les estructures de control alternatives consulteu el subapartat Estructures de control del shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
78
Taula 66. Format de les estructures alternatives if-then-endif if condici acci(ns) endif Objectiu Si la condici es verifica, executa les accions indicades a partir del bloc then. Si no es compleix la condici, no executa el bloc then i continua a partir de la instrucci segent del bloc if-endif. Exemples de lordre if (5 < = 10 ) then echo ok endif set NOM = "Divendres" if ( "$NOM" = = " Divendres" ) then echo ok endif if ("${USER}" != " root " ) then echo incorrecte, tu has dsser el supervisor" exit 1 endif echo " Executant el programa" Comprova la condici i si la condici s veritat escriu el text incorrecte..., i acaba lexecuci del gui amb lestat de sortida a 1. En cas contrari executa lordre que s a continuaci del bloc ifendif, s a dir visualitza el rtol Executant... Comprova la condici. Ja que s veritat la condici escriu la paraula ok. Resultat de lordre Comprova la condici. Ja que s veritat la condici escriu la paraula ok. then
Taula 67. Format de les estructures alternatives if-then-else-endif if condici acci(ns) else acci(ns) endif Objectiu Si la condici es verifica, executa les accions indicades a partir del bloc then i una vegada executades continua a partir de la segent ordre del bloc if-endif. Si no es compleix la condici, executa les accions del bloc else i continua a partir de la instrucci segent del bloc if-endif. Exemples de lordre if ( "$NUM" < 10 ] echo ok else echo fals endif set NOM = "Divendres" if ( "$NOM" = = " Dilluns") then echo ok else echo "Dilluns" endif Comprova la condici. La condici s falsa i per tant escriu la paraula Dilluns. then Resultat de lordre Comprova la condici. Si s veritat la condici escriu la paraula ok, en cas contrari escriu la paraula fals. then
2) switch. Lestructura switch inicialitza la selecci dacord amb el valor duna variable i en funci del seu contingut actua duna manera o duna altra. En la taula 68, teniu informaci sobre el bloc switchendsw.
Sistemes operatius
79
Taula 68. Format de l'ordre switch switch-endsw switch (variable) case valor1: accio1 acci2 ............ accin breaksw case valor2: accio1 acci2 ............ accin breaksw case valor3: accio1 acci2 ............ accin brealsw ..................... default: accio1 acci2 ............ accin breaksw endsw Objectiu Lordre agafa el contingut de la variable i comprova amb quin patr coincideix. En funci del resultat, executa les accions corresponents. Una vegada executades aquestes accions, surt del bloc switchendsw i continua amb la segent instrucci del bloc. En el cas que el contingut de la paraula no coincideixi amb cap patr, executa les accions del bloc indicat en default i continua lexecuci a partir de lordre que hi ha a continuaci del bloc switch-endsw. Exemples de lordre set VALOR = /prova switch ($VALOR) case -f: set FILE = "${VALOR}" breaksw case d: set DIR = "${VALOR}" breaksw default: echo "No s un fitxer ni un directori" breaksw endsw Exemple d'estructures alternatives Dissenyem un gui anomenat positiu utilitzant el shell de C, que pregunti a lusuari un nombre. El gui ens ha de dir si el nombre entrat s positiu. #!/bin/csh # El nom del gui s: positiu # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Permet saber si un nombre enter s positiu Resultat de lordre La primera i segona condici permet comprovar si el contingut de la variable VALOR s un fitxer o un directori. En el cas de ser un fitxer es guarda el contingut de la variable VALOR en la variable FILE. Si el contingut de la variable VALOR s un directori es guarda en la variable DIR. Si el contingut de la variable VALOR no s un fitxer ni un directori es visualitza el text relacionat amb aquesta situaci.
Sistemes operatius
80
# ----------------------bloc principal -------------------------clear echo -n "Dnam un nombre:" @ nombre = "$<" if ($nombre > 0) then echo "El nombre entrat: $nombre s positiu" else echo "El nombre entrat: $nombre no s positiu" endif echo -n "Prmer qualsevol tecla per a continuar." set tecla = "<" clear exit 0 # -------------------------fi----------------------------
Exemple d'estructures alternatives Utilitzant el shell de T, dissenyem un gui anomenat buscar que pregunti un nmero, i si el nmero entrat s 2, 50, o 45, visualitzi la paraula "Veritat" i en cas contrari, presenti la paraula "Fals". #!/bin/tcsh # El nom del gui s: buscar # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Permet saber si un nombre entrat coincideix amb algun dels nombres: 2, 50, o -45 # -------------------bloc principal------------------------clear echo -n "Dnam un nombre:" @ nombre = "$<" switch ($nombre) case 2: echo "Veritat" breaksw case 50: echo "Veritat" breaksw case -45: echo "Veritat" breaksw default : echo "Fals" breaksw endsw echo -n "Prmer tecla per a continuar." set tecla = "$<" clear exit 0 #-------------fi--------------------
Estructures repetitives
En els shells de C i de T, tamb podem utilitzar les estructures de control anomenades repetitives.
Una estructura repetitiva s un conjunt daccions que es van repetint mentre es compleixen determinades condicions.
Dintre del grup de les estructures repetitives podem trobar com a ordres ms representatives les segents: while (taula 69) i foreach (taula 70).
Sistemes operatius
81
Taula 69. Format de l'ordre while while while condici acci(ns) end Objectiu Si s veritat el resultat de la condici, repeteix el bloc de les accions indicades fins a end. Una vegada lacci ha arribat a lordre end, aquesta la reenva a la lnia de lordre while i es torna a comprovar la condici. Quan el valor retornat de la condici s fals, lexecuci passa a la segent ordre del bloc whileend. Exemples de lordre @ i=1 while ($i <= 5 ) echo ${i} @ i ++ end Taula 70. Format de l'ordre foreach foreach foreach variable (llista valors) acci(ns) end Objectiu Repeteix les accions indicades fins a end un nombre de vegades que coincideix amb el nombre delements de la llista-valors. Exemples de lordre foreach VALOR (10 2 37 40) echo $VALOR end Resultat de lordre Inicialitza la variable VALOR amb el primer valor de la llista i visualitza el seu contingut, aix es repeteix amb tots els valors de la llista. Resultat de lordre Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui ms petit o igual que 5 anir visualitzant el seu contingut. Lordre @ i ++ ens permet anar incrementant el valor de la variable i.
Control de bucles
En determinats moments podem necessitar sortir dels bucles abans dacabar-ho o anar de manera directa a comprovar la condici de la instrucci sense haver de passar per lordre end. Aquestes possibilitats ens les ofereixen les ordres break i continue. Noms les podem utilitzar en les ordres while i foreach (en el shell de C i en el shell de T noms s possible utilitzar el format break i continue sense assignar cap valor a les ordres).
!!
Per estudiar el funcionament de les ordres break i continue consulteu el subapartat Estructures de control del shell de Bourne de lapartat El shell de Bourne.
!!
Per estudiar el funcionament de lordre @ consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
82
# La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Ens pregunta nombres fins que hem entrat el -l # -----------------------bloc principal -------------------------@ nombre = 0 while ($nombre != -1) clear echo -n "Escriu un nombre:" @ nombre = "$<" end echo n "Prmer qualsevol tecla per a continuar. set tecla = "$<" clear exit 0 # -------------------fi-----------------------------
Utilitzant el shell de C, dissenyem un gui anomenat per, que escrigui cinc vegades la paraula informtica.
#!/bin/csh # El nom del gui s: per # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Escriu la paraula Informtica 5 vegades # --------------------bloc principal------------------------------clear foreach j (1 4 3 2 0) echo "Informtica" end echo n "Prmer qualsevol tecla per a continuar. set tecla = "$<" clear exit 0 #------------fi------------
Utilitzant el shell de T, dissenyem un gui anomenat nmeros que ens pregunti un nmero positiu i que ens tregui tots el nmeros que van de zero fins al nmero entrat incrementats de 2 en 2.
#!/bin/tcsh # El nom del gui s: nmeros # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Treu el nmeros que van des de zero fins a un nmero incrementats de 2 en 2 #-------------------------bloc principal -------------------------@ numero = 0 @ comptador = 0 while ($numero <= 0) echo -n "Has dentrar un nmero positiu:" set numero = "$<" end while ($comptador <= $numero) echo $comptador @ comptador += 2 end echo n "Prmer qualsevol tecla per a continuar." set tecla = "$<" clear exit 0 #-------------fi----------
Sistemes operatius
83
Un array s un variable que en un mateix moment hi podem guardar diferents tipus dinformacions. Sutilitza un ndex per indicar el lloc on situem la informaci dins de la variable. Aquest ndex comena pel valor u.
!!
Per estudiar el pas de parmetres als guions consulteu el subapartat Pas de parmetres i la seva gesti en els guions del shell de Bourne de lapartat El shell de Bourne.
El nom_gui correspon a largument0; sistemes, a largument1; informtics :, a largument2; i Unix, a largument3. Aix, si el gui sanomena pas, una possible estructura seria: #!/bin/tcsh # El nom del gui s: pas # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Exemple de pas de parmetres # ------------------------bloc principal --------------------------
Sistemes operatius
84
clear echo $1 $2$3 echo n "Prmer tecla." set tecla = "$<" clear exit 0 # --------------------final---------------------------------------------Per executar el gui anterior, cal escriure en la lnia dordres: pas sistemes informtics: Unix
Exemple del pas d'arguments a un gui Suposem que tenim el gui imprimir, que ens dna la possibilitat dimprimir el contingut de qualsevol fitxer de tipus ASCII. Lestructura del fitxer s: #!/bin/csh # El nom del gui s: imprimir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # exemple de passar qualsevol nombre de parmetres # -----------------------------------------bloc principal -------------------------while ("$1" != "") lpr $1 shift end echo -n "Final del procs. Premeu qualsevol tecla." set tecla = "$<" clear exit 0 # --------------------------------------------------fi ---------------------------------------------------
Sistemes operatius
85
#!/bin/csh # Exemple .cshrc set history=50 set savehist=50 set ignoreeof noclobber if ($?prompt) then set prompt=\!]% alias f finger -R alias lo logout endif 2) Exemple del fitxer .login #!/bin/csh # Exemple .login echo "Benvinguts a lIES" 3) Exemple del fitxer .logout #!/bin/csh # Exemple .logout echo -n " Sortida de lIES " date
Referent al shell de T quan arrenca (comencem una sessi), en primer lloc es llegeix i sexecuten les ordres des de larxiu /etc/csh.cshrc o /etc/csh.login si existeixen. Desprs busca ~/.tcshrc o ~/.cshrc, en aquest ordre i llegeix i executa les ordres des del primer que existeix i s llegible. Per sortir del shell de T executa el fitxer /etc/csh.logout o ~/.logout si existeix. El fitxer /etc/csh.cshrc sexecuta quan comencem la sessi per primera vegada i ~/.tcshrc sexecuta cada vegada que sobre una sessi en el shell de T (obertura duna finestra).
Exemple dels fitxers /etc/csh.cshrc, .tcshrc i csh.logout Aqu teniu uns exemples del contingut dels fitxers /etc/csh.cshrc, .tcshrc i csh.logout: 1) Exemple del fitxer /etc/csh.cshrc #!/bin/tcsh # Exemple csh.cshrc [ " `id -gn `" = " `id un `" -a `id u ` -gt 99 ] if $status then umask 022 else umask 002 endif if ($?prompt) then if ($?tcsh) then set prompt = [ %n@%m %c]$ else set prompt = \ [ `id -nu `@` hostname -s `\ ] \$\ endif endif if ( -d /etc/profile.d ) then set nonomatch foreach i ( /etc/profile.d/*.csh ) if ( -r $i ) then source $i endif end unset i nonamatch endif
Sistemes operatius
86
2) Exemple del fitxer .tcshrc #!/bin/tcsh alias rm rm i aias cp cp i alias mv mv -i setenv path "/usr/local/sbin:/usr/sbin:/sbin:${path}:${home}/bin" set prompt = [%n@%m %c]#
3) Exemple del fitxer csh.logout #!/bin/tcsh echo -n " Sortida de lIES " sleep 10 clear
Sistemes operatius
87
Nom de lordre
printenv sched
Sistemes operatius
88
3. El shell de Korn
El shell de Korn s un intrpret en lnia d'ordres en els sistemes Linux i Unix. s totalment compatible amb el shell de Bourne i tamb inclou molts elements del shell de C. El principal avantatge del shell de Korn respecte a altres intrprets tradicionals del sistema Unix s la seva utilitzaci com a llenguatge de programaci.
3.1. El shell de K
Hi ha hagut diverses versions del shell de K des de la versi ksh88 fins a la versi ksh93. La versi ksh93 permet treballar amb arrays i amb expressions matemtiques de coma flotant; s la versi que sest distribuint en aquests moments. Hi ha tamb dues versions modificades del ksh93 que afegeixen noves caracterstiques per a la manipulaci de lentorn grfic: el dtksh que forma part de CDE i el tksh, que permet utilitzar Tk (llibreries de tipus grfic). El shell de K, conegut com a ksh, va ser desenvolupat per David Korn (AT&T Bell Laboratories) durant els anys 80. s bastant compatible amb el shell de Bourne i inclou algunes caracterstiques del shell de C.
Llicncia del shell de K Fins a lany 2000, el shell de Korn era propietat de lempresa AT&T. Des de aleshores lempresa AT&T va comenar a distribuir una llicncia dutilitzaci daquest shell. Cap a lany 2005 es va comenar a distribuir una versi anomenada ksh93 sota llicncia pblica.
El common desktop environment (CDE) s un tipus descriptori que es pot utilitzar en els sistemes Unix/Linux.
Versi de shell installada Si volem saber el shell que tenim installada podem utilitzar lordre: echo SHELL. Tamb podem saber tots els intrprets dordres que podem utilitzar en la distribuci dUnix que estem utilitzant a travs de lordre cat / etc/shells.
Ajuda del shell de Korn Podem obtenir una llista de les ordres internes del shell de K a travs de lordre man builtin. Tamb podem obtenir ajuda sobre aquestes ordres a partir de lordre help nom_ordre.
2) Comentaris: sutilitza la mateixa tcnica que en el shell de Bourne. En la taula 74, teniu un exemple sobre la manera de posar comentaris en un gui. 3) Utilitzaci de carcters especials: podem fer servir tots els metacarcters, com les dobles cometes (), les cometes senzilles (), laccent greu (`),
!!
Per estudiar ls de comentaris consulteu el subapartat Informaci general sobre el shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
89
el backslash (\), el dlar ($), la pipeline (|), i els canvis dadrea (>, <, >>, <>, 2>&1 i <<). 4) En el shell de K, tamb podem utilitzar els segents smbols com a patrons: *, ?, [valor1...valorn], [valor1-valorn], [!valor1...valorn], [!valor1-valorn] , { }, i ~ (titlla). 5) Ordres simples. Les ordres simples funcionen de la mateixa manera que en el shell de Bourne. 6) Llistes dordres (;, &, && i ||). Tenen el mateix significat que en el shell de Bourne. 7) Agrupament dordres ((), {}). Tenen el mateix significat que en el shell de Bourne. 8) Historial de les ordres. Una de les diferncies amb el shell de Bourne s la possibilitat de disposar dun historial de les ordres que utilitzem, perqu aix podem repetir qualsevol de les ordres duna manera ms fcil. En la taula 75, teniu informaci sobre la manera dutilitzar leina history.
Taula 75. Format de l'ordre history history history [opcions] Objectiu Gestionar les ordres utilitzades de manera interactiva. Exemples de lordre history history -12 history 4 7 Resultat de lordre Visualitza les ordres utilitzades. Visualitza les 12 ltims ordres utilitzades. Visualitza les ordres utilitzades que van des de la 4 fins a la 7.
!!
Per estudiar la utilitzaci de carcters especials, patrons, ordres simples, llistes dordres i agrupament dordres, consulteu el subapartat Informaci general sobre el shell de Bourne de lapartat El shell de Bourne.
9) Definici i utilitzaci dlies. Un lies s el nom que sassigna a una ordre o a un conjunt dordres. Escrivint el nom de llies en la lnia dordres executar les ordres que el formen. Podem utilitzar lordre alias (taula 76) per aconseguir aquest objectiu.
Taula 76. Format de l'ordre alias i unalias alias/unalias 1) alias 2) alias nom 3) alias nom= llista_ordres 4) unalias nom Objectiu 1: visualitzar tots els lies. 2: permet veure el contingut de nom. 3: permet crear un lies. 4: unalias ens permet anullar qualsevol lies creat.
Sistemes operatius
90
alias/unalias Exemples de lordre alias unalias fita alias dir=date dir alias dir Resultat de lordre Visualitza els lies. Elimina llies fita. Crea un lies anomenat dir, que cont lordre date. Executar lordre date. Visualitza el contingut de llies anomenat dir.
Sistemes operatius
91
$nom_variable Objectiu 1: gestionar el contingut duna variable utilitzant el nom especfic de la variable. 2: gestionar el contingut duna variable utilitzant el nom especfic de la variable i afegint carcters. Exemples de lordre nom=Josep Mas echo $nom Resultat de lordre Assigna a la variable nom la informaci de lexpressi. Visualitza el contingut de la variable nom.
En el shell de K, per visualitzar el contingut duna variable podem utilitzar lordre echo, printf i print (taula 79). El format de lordre echo t el mateix significat que en el shell de Bourne. Consulteu aquest apartat en el shell de Bourne. El format de lordre printf t el mateix significat que en el shell de C.
Taula 79. Format de l'ordre print print print [opcions] [arguments] Objectiu Visualitzar rtols o continguts de variables. Exemples de lordre nom=Josep Mas print $nom nom="Josep" print "Hola amic $nom" Resultat de lordre Assigna a la variable nom la informaci de lexpressi. Visualitza el contingut de la variable nom. Visualitza el rtol Hola amic Josep.
!!
Per estudiar lordre echo consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
92
typeset Exemples de lordre Format 1: A=5 B=4 ((C=A * B)) echo $C Format 2: typeset i A=5 B=4 C A=5 B=4 ((C=A * B)) print $C integer x=6 o typeset i x=6 Format 1: typeset vector[4] vector[0]=pera vector[1]=pltan vector[2]=taronja vector[3]=mel Format 2: typeset vector[0] vector[0]=pera vector[1]=pltan vector[2]=taronja vector[3]=mel Format 3: vector[0]=pera vector[1]=pltan vector[2]=taronja vector[3]=mel float numero=14.35 Declarem la variable numero com de tipus float i li assignem el valor de 14.35. Declarem la variable x entera i li assignem el valor de 6. Declarem una variable vector de tipus array indexat i li assignem els valors: vector[0]=pera vector[1]=pltan vector[2]=taronja vector[3]=mel El resultat ser: 20 Resultat de lordre El resultat ser: 5*4
Tipus de variables
No totes les variables que utilitzem en lentorn sn del mateix tipus. Les podem classificar de la manera segent: 1) Definides per lusuari. Sn variables creades per lusuari. Per gestionar-les shan de seguir els passos que acabem dindicar. Aquestes variables desapareixen en el moment que acaben una sessi en Unix o b quan nosaltres ho decidim. Lentorn s la zona disponible per part dun determinat usuari. Aquesta zona fa referncia a les variables que t assignades, les eines que pot utilitzar, els recursos disponibles, etc. 2) Definides pel sistema. El shell utilitza diverses variables que sn creades i a les quals sassignen valors durant el procs de connexi. Tota la informaci que el sistema ens assigna sanomena entorn. Quan sinvoca el
Sistemes operatius
93
shell de connexi al sistema, aquest busca un entorn estndard proporcionat pel sistema i crea una nova variable shell amb el nom especificat i el valor indicat. Lentorn es pot modificar amb noves definicions en el fitxer .kshrc o utilitzant la lnia de la interfcie dusuari. Si no hi fem canvis, lentorn estndard es passar a qualsevol ordre executada pel shell o per qualsevol subshell. En la taula 81, podeu veure algunes variables del sistema en el shell de K.
Taula 81. Nom i contingut d'algunes variables del sistema Nom de variable CDPATH EDITOR ENV FPATH HISTSIZE HOME LOGNAME MAIL MAILPATH PATH PS1 PS2 PWD SHELL Descripci Desa el lloc on ha danar quan sexecuta lordre cd. El cam de leditor. Indicar el lloc del gui que sexecutar quan es cridi al ksh. Lloc on va a buscar els fitxers de funcions. Nombre dordres histrics. Indica el directori de lusuari. Cont el nom de lusuari. Nom del fitxer de correu. Lloc de la bstia. Indica el lloc on shan danar a buscar els fitxers executables. Cont el format del primer prompt. Cont el format del segon prompt. Directori de treball. Indica el lloc de lintrpret dordres.
Exemple de visualitzaci del contingut d'algunes variables del sistema Dissenyem un gui utilitzant el shell de K, anomenat prova13 que presenti el nom de lusuari, lintrpret dordres utilitzat, el smbol del prompt principal, el directori de lusuari, els llocs on busca els programes executables i el lloc de la nostra bstia. Una soluci podria ser la segent: #!/bin/ksh # El nom del gui s: prova13 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar el contingut de variables del sistema # *************bloc principal ***************** clear print " El nom de lusuari s: ${LOGNAME}" print " El shell utilitzat s: ${SHELL}" print " El prompt principal s: ${PS1}" print " El directori dusuari s: ${HOME}" print " Els directoris on Unix busca els programes executables sn: ${PATH}" print " La bstia est situada en: ${MAILPATH}" sleep 10 clear exit 0 # ****************Final*************
!!
Per estudiar el funcionament de les variables especials, consulteu el subapartat Gesti de variables en el shell de Bourne de lapartat El shell de Bourne.
3) Variables especials. En el shell de K, podem utilitzar com a variables especials les segents: #, n, * i $. El significat daquestes variables s el mateix que en el shell de Bourne. Hi ha, per, dos formats nous de varia-
Sistemes operatius
94
bles especials que podem utilitzar: nmero i @. En la taula 82, teniu informaci sobre la seva utilitzaci.
Taula 82. Variables especials numero @ 1) nmero 2) @ Objectiu 1: fa referncia a la posici de largument. Podem utilitzar valors superiors a 9, sempre que ho indiquem dins de { }. 2: fa referncia als arguments expressats en cometes dobles. Exemples de lordre echo ${15} echo "${@}" echo "${@:3}" echo "${@:3:10}" Resultat de lordre Visualitza el contingut del parmetre corresponent a la posici 15. Visualitza els arguments passats al gui. Visualitza els parmetres posicionals des de la posici 3 fins al final. Visualitza els parmetres posicionals des de la posici 3 fins a la posici 10.
Exemple d'utilitzaci de variables especials Dissenyem un gui anomenat prova14 utilizant el shell de K, que presenti el nom del gui, el nombre de parmetres passats i els seus noms, lestat de sortida i el PID del gui. Una soluci podria ser la segent: #!/bin/ksh # El nom del gui s: prova14 # La data de creaci: 30-05-07 # La persona que ha creat aquest gui s: jee # Permet visualitzar el contingut de variables del sistema # *************bloc principal ***************** clear echo " El nom del gui s: ${0}" echo " El nombre de parmetres passats al gui sn: ${#}" echo " Els noms del parmetres passats sn : ${*}" echo " Lestat de sortida s: ${?}" echo " El PID del gui s: ${$}" sleep 10 clear exit 0 # ****************Final*************
!!
Per estudiar el funcionament de les variables locals i globals consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
95
Eliminar variables
!!
De la mateixa manera que podem crear variables, tamb en qualsevol moment podem anullar-les sense haver dacabar una sessi en Unix. Lordre que ens permet fer aquestes funcions s unset.
Per estudiar lordre set, unset i read consulteu el subapartat Gesti de les variables en el shell de Bourne de lapartat El shell de Bourne.
!!
Per estudiar lordre exit consulteu el subapartat Acabar un shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
96
Sistemes operatius
97
test/[ ]/[[ ]]/(( )) Exemples de lordre test 100 eq 50 echo $? [ "${HOME} " = /home/josep ] echo $? [ "Hola" = "mn" ] echo $? NUM=10 [ $NUM gt 10 ] echo $? [ -d josep ] echo $? [ -f prova -a -x prova ] echo $? [ -c users -o -d directori ] echo $? a=5 [[ ${a} eq 5 ]] echo $? a=3 [ ${a} eq 3 ] echo $? a=3 ((${a}>=5)) echo $? Retorna 1 ja que s falsa la condici. Retorna 0 ja que s veritat la condici. Retorna 0 ja que s veritat una o totes les condicions. Retorna 0 ja que s veritat la condici. Retorna 0 ja que sn veritat les condicions. Retorna 0 ja que s veritat la condici. Retorna 1 ja que la condici s falsa. Retorna 1 ja que s falsa la condici. Retorna 0 ja que s veritat la condici. Resultat de lordre Retorna 1 ja que s falsa la condici.
Estructures alternatives En el shell de K podem utilitzar les estructures de control anomenades alternatives. Els conceptes aplicats al shell de Bourne s poden aplicar tamb al shell de K. Les ordres ms representatives daquest tipus destructures sn les ordres if i case: 1) if. Aquesta ordre t diversos formats: if-then-fi (taula 84), if-then-elsefi (taula 85) i if-then-elif-else-fi (taula 86).
Taula 84. Format de les estructures alternatives if-then-fi if condici then acci(ns) fi Objectiu Si la condici es verifica, executa les accions indicades a partir del bloc then. Si no es compleix la condici, no executa el bloc then i continua a partir de la instrucci segent del bloc if-fi. Exemples de lordre if [ 5 -lt 10 ] then echo ok fi Resultat de lordre Comprova la condici. Ja que s veritat la condici escriu la paraula ok.
!!
Per estudiar les estructures de control alternatives consulteu el subapartat Estructures de control del shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
98
if-then-fi Exemples de lordre NOM="Divendres" if [ "$NOM" = " Divendres" ] then echo ok fi if test "$USER" != " root " then echo "incorrecte, tu has dsser el supervisor" exit 1 fi echo " Executant el programa" a=10 if ((${a}>5)) then echo "OK" fi a=10 if [[ ${a} gt 5 ]] then echo "OK" fi a=10 if [ ${a} gt 5 ] then echo "OK" fi a=10 if test ${a} gt 5 then echo "OK" fi Comprova la condici. Ja que s veritat la condici escriu la paraula ok. Comprova la condici. Ja que s veritat la condici escriu la paraula ok. Comprova la condici. Ja que s veritat la condici escriu la paraula ok. Comprova la condici. Ja que s veritat la condici escriu la paraula ok. Comprova la condici i si la condici s veritat escriu el text incorrecte..., i acaba lexecuci del gui amb lestat de sortida a 1. En cas contrari executa lordre que hi ha a continuaci del bloc iffi, s a dir visualitza el rtol Executant... Resultat de lordre Comprova la condici. Ja que s veritat la condici escriu la paraula ok.
Taula 85. Format de les estructures alternatives if-then-else-fi if condici then acci(ns) else acci(ns) fi Objectiu Si la condici es verifica, executa les accions indicades a partir del bloc then i una vegada executades continua a partir de la segent ordre del bloc if-fi. Si no es compleix la condici, executa les accions del bloc else i continua a partir de la instrucci segent del bloc if-fi. Exemples de lordre if [ ${NUM} -lt 10 ] then echo ok else echo fals fi Resultat de lordre Comprova la condici. Si s veritat la condici escriu la paraula ok, en cas contrari escriu la paraula fals.
Sistemes operatius
99
if-then-else-fi Exemples de lordre NOM=""Divendres" if [ ${NOM} = " Dilluns" ] then echo ok else echo "Dilluns" fi if ((100= =50)) then print "OK" else print "Fals" fi a=100 if [[ ${a} eq 50 ]] then print "OK" else print "Fals" fi Taula 86. Format de les estructures alternatives if-then-elif-else-fi if condici then acci(ns) elif condici then acci(ns) elif condici then acci(ns) ....................... else acci(ns) fi Objectiu Si la primera condici es verifica, sexecuten les accions indicades a partir del bloc then i una vegada executades continua a partir de la segent ordre del bloc if-fi. Si no es compleix la condici, comprova la primera condici del bloc elif. Si es compleix la condici executa les accions daquest bloc i continua a partir de la segent acci del bloc if-fi. En cas de no complir-se la primera condici del bloc elif, passa a comprovar les segents condicions dels segents bloc elif, executant el bloc daccions si es compleix alguna de les condicions. En el cas de no complir-se cap de les condicions sexecuta les accions del bloc else i continua a partir de la instrucci segent del bloc if-fi. Exemples de lordre if [ -x ${FILE} ] then ${FILE} elif [ -w ${FILE} ; then vi ${FILE} else echo "${FILE} no s executable i ta mpoc hi podem escriure" exit 1 fi Resultat de lordre Comprova si el fitxer representat per la variable FILE s executable, en cas afirmatiu lexecuta. Si el fitxer no s executable comprova si el podem modificar; en cas afirmatiu, el manipulem mitjanant leditor vi. Si el fitxer no s executable ni modificable amb leditor vi, aleshores visualitzem un text relacionat amb aquesta situaci. Comprova la condici. La condici s falsa i per tant escriu la paraula Fals. Comprova la condici. La condici s falsa i per tant escriu la paraula Fals. Resultat de lordre Comprova la condici. La condici s falsa i per tant escriu la paraula Dilluns.
Sistemes operatius
100
2) case. Lestructura case inicialitza la selecci dacord amb el valor duna variable i en funci del seu contingut actua duna manera o duna altra. En la taula 87, teniu informaci sobre el bloc case-esac.
Taula 87. Format de l'ordre case case-esac case variable in patro1) accio1 acci2 ............ accin ;; patro2) accio1 acci2 ............ accin ;; patro3) accio1 acci2 ............ accin ;; ..................... *) accio1 acci2 ............ accin ;; esac Objectiu Lordre agafa el contingut de la variable i comprova amb quin patr coincideix. En funci del resultat, executa les accions corresponents. Una vegada executades aquestes accions, surt del bloc case-esac i continua amb la segent instrucci del bloc. En el cas que el contingut de la paraula no coincideixi amb cap patr, executa les accions del bloc indicat en * i continua lexecuci a partir de lordre que hi ha a continuaci del bloc case-esac. Exemples de lordre VALOR=/prova case ${VALOR} in -f) FILE="${VALOR}" ;; -d) DIR="${VALOR}" ;; *) Echo "No s un fitxer ni un directori" ;; esac Resultat de lordre La primera i segona condici permet comprovar si el contingut de la variable VALOR s un fitxer o un directori. En el cas de ser un fitxer es guarda el contingut de la variable VALOR en la variable FILE. Si el contingut de la variable VALOR s un directori es guarda en la variable DIR. Si el contingut de la variable VALOR no s un fitxer ni un directori es visualitza el text relacionat amb aquesta situaci.
Exemple d'estructures alternatives Dissenyem un gui anomenat positiu utilitzant el shell de K, que pregunti a lusuari un nombre. El gui ens ha de dir si el nombre entrat s positiu.
Sistemes operatius
101
#!/bin/ksh # El nom del gui s: positiu # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Permet saber si un nombre enter s positiu # ----------------------bloc principal -------------------------clear echo -n "Dnam un nombre:" read nombre if ((${nombre}> 0) ) then echo "El nombre entrat: $nombre s positiu" else echo "El nombre entrat: $nombre no s positiu" fi echo -n "Prmer qualsevol tecla per a continuar." Read tecla clear exit 0 # -------------------------fi----------------------------
Exemple d'estructures alternatives Utilitzant el shell de K, dissenyem un gui anomenat buscar que pregunti un nombre, i si el nombre entrat s 2, 50, o -45, visualitzi la paraula "Veritat" i en cas contrari, presenti la paraula "Fals". #!/bin/ksh # El nom del gui s: buscar # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Permet saber si un nombre entrat coincideix amb algun dels nombres: 2, 50, o -45 # -------------------bloc principal------------------------clear echo -n "Dnam un nombre:" read nombre case ${nombre} in 2) echo "Veritat" ;; 50) echo "Veritat" ;; -45) echo "Veritat" ;; *) echo "Fals" ;; esac echo -n "Prmer tecla per a continuar." read tecla clear exit 0 #-------------fi--------------------
Estructures repetitives
En el shell de K tamb podem utilitzar les estructures de control anomenades repetitives.
Una estructura repetitiva s un conjunt daccions que es van repetint mentre es compleixen determinades condicions.
Dintre daquest grup podem trobar com a ordres ms representatives les segents: while-do-done (taula 88), until-do-done (taula 89), for-do-done (taula 90) i select-do-done (taula 91).
Sistemes operatius
102
Taula 88. Format de l'ordre while while while condici do acci(ns) done Objectiu Si s veritat el resultat de la condici, repeteix el bloc de les accions indicades entre do i done. Una vegada lacci ha arribat a lordre done, aquesta la reenvia a la lnia de lordre while i es torna a comprovar la condici. Quan el valor retornat de la condici s fals, lexecuci passa a la segent ordre del bloc while-do-done. Exemples de lordre i=1 while ((${i}<= 5 )) do echo ${i} ((i++)) done A=0 B=1 C=3 D=5 while ((D=A+B+C)) do print $D done i=1 while [[ ${i} -lt 5 ]] do echo ${i} ((i++)) done i=1 while [ ${i} lt 5 ] do echo ${i} ((i++)) done i=1 while test ${i} lt 5 do echo ${i} ((i++)) done Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui ms petit o igual que 5 anir visualitzant-ne el contingut. Lordre ((i++)) ens permet anar incrementant el valor de la variable i. Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui ms petit o igual que 5 anir) visualitzant el seu contingut. Lordre ((i++) ens permet anar incrementant el valor de la variable i. Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui ms petit o igual que 5 anir visualitzant-ne el contingut. Lordre ((i++)) ens permet anar incrementant el valor de la variable i. No fa res ja que la condici no es compleix. Resultat de lordre Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui ms petit o igual que 5 anir visualitzant el seu contingut. Lordre ((i++) ens permet anar incrementant el valor de la variable i.
Taula 89. Format de l'ordre until until until condici do acci(ns) done Objectiu Executa les accions situades entre el do i done fins que el valor retornat per la condici s veritat.
Sistemes operatius
103
until Exemples de lordre i=1 until [[ ${i} -eq 5 ]] do echo ${i} ((i++) done a=/alfa until [ ! r ${a} ] do cat $1 >> pepe chmod a+x $a done Si el fitxer alfa existeix i no t el perms de lectura el seu contingut safegeix al fitxer pepe. Resultat de lordre Sinicialitza la variable i a 1. Mentre el valor de la variable i sigui diferent de 5 anir visualitzant el seu contingut. Lordre ((i++)), ens permet anar incrementant el valor de la variable i.
Taula 90. Format de l'ordre for for for variable in llista valors do acci(ns) done for ((valor inicial; condici; increment)) (noms versi ksh93) do acci(ns) done Objectiu Repeteix les accions indicades entre do i done un nombre de vegades que coincideix amb el nombre delements de la llista-valors. Exemples de lordre for VALOR in 10 2 37 40 do echo ${VALOR} done for FILE in `ls` do echo ${FILE} done for dir in /dev /usr /user/bin /lib do num=`ls ${dir} | wc w ` echo "${num} de fitxers en ${dir}" done for ((i=0; i<5; i ++)) do print ${i} done Visualitza els valors que van de 0 fins a 4. Visualitza el nombre de fitxers que hi ha dins de cada directori. Visualitza el nom dels fitxers on estem situats. Resultat de lordre Inicialitza la variable VALOR amb el primer valor de la llista i visualitza el seu contingut. Aix es repeteix amb tots els valors de la llista.
Taula 91. Format de l'ordre select select select variable in llista valors do acci(ns) done
Sistemes operatius
104
select Objectiu Permetre generar simples mens amb les opcions indicades en la llista de valors. Cada un dels elements del men comena amb un nmero. Hem de seleccionar un valor del men. Exemples de lordre PS3="Introdueix un nmero:" select i in 10 2 37 40 do case $i in 10|2|37|40) print "Opci correcta" ;; *) print "Opci incorrecta;; esac done Visualitza: 1) 10 2) 2 3) 37 4) 40 Introdueix un nmero: Resultat de lordre
Control de bucles
En determinats moments podem necessitar sortir dels bucles abans dacabar-ho o anar de manera directa a comprovar la condici de la instrucci sense haver de passar per lordre done. Aquestes possibilitats ens les ofereixen les ordres break i continue. Noms les podem utilitzar en les ordres while i until (en el shell de K noms s possible utilitzar el format break i continue sense assignar cap valor a les ordres).
!!
Per estudiar les ordres break i continue consulteu el subapartat Estructures de control del shell de Bourne de lapartat El shell de Bourne.
!!
Per estudiar lordre expr consulteu el subapartat Expressions matemtiques del shell de Bourne de lapartat El shell de Bourne.
(( expressi )). En la taula 93, teniu informaci sobre aqueta lordre. Aquests format dexpressi aritmtica es pot utilitzar en les diferents
Sistemes operatius
105
sentncies de control de flux. En aquest cas lexpressi va entre dobles parntesis, per sense el smbol $ davant.
Taula 93. Format de l'ordre ((expressi)) (( )) ((expressi)) Objectiu Calcular el valor de lexpressi. Operadors: +, -, *, /, %. ((variable=variable operador variable)) ((x++)): incrementa el valor de la variable x en 1. ((x--)): decrementa el valor de la variable x en 1. ((x+=valor)): suma al contingut de la variable x, el valor i ho guarda el resultat en x. ((x-=valor)) : resta al contingut de la variable x, el valor i ho guarda el resultat en x. ((x*=valor)) : multiplica al contingut de la variable x, el valor i ho guarda el resultat en x. ((x/=valor) : divideix al contingut de la variable x, el valor i ho guarda el resultat en x. ((x%=valor)) : agafa la resta de la divisi entera entre el contingut de la variable x i el valor, i guarda el resultat en x. Exemples de lordre VAR=55 ((VAR=VAR+1)) echo $VAR VAR=55 ((++VAR )) echo $VAR VAR=55 ((VAR++ )) echo $VAR echo $((VAR*22)) ((a=3+8)) echo $a a=20 ((b=a+10)) echo $b ((a=(3+5)/8)) echo $a Exemple d'estructures repetitives Utilitzant el shell de K, dissenyem un gui anomenat repetir que ens pregunti nombres fins que entrem el nombre -1. #!/bin/ksh # El nom del gui s: repetir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Ens pregunta nombres fins que hem entrat el -l # -----------------------bloc principal -------------------------((nombre = 0)) while ((${nombre}!= -1)) do clear echo -n "Escriu un nombre:" read nombre Visualitza el resultat d1. Visualitza el resultat de 30. Visualitza el resultat de multiplicar el contingut de la variable per 22. Visualitza el resultat d11. Suma un a la variable VAR. Suma un a la variable VAR. Resultat de lordre Suma un a la variable VAR. Observeu que no sutilitza el carcter $.
Sistemes operatius
106
done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 # -------------------fi-----------------------------
Exemple d'estructures repetitives Utilitzant el shell de K, dissenyem un gui anomenat per, que escrigui cinc vegades la paraula informtica. #!/bin/ksh # El nom del gui s: per # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Escriu la paraula Informtica 5 vegades # --------------------bloc principal------------------------------clear for a in 1 4 3 2 0 do echo "Informtica" done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 #------------fi------------
Exemple d'estructures repetitives Utilitzant el shell de K, dissenyem un gui anomenat nmeros que ens pregunti un nmero positiu i que ens tregui tots el nmeros que van de zero fins al nmero entrat incrementats de 2 en 2. #!/bin/ksh # El nom del gui s: nmeros # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Treu el nmeros que van des de zero fins a un nmero incrementats de 2 en 2 #-------------------------bloc principal -------------------------((numero=0)) ((comptador=0)) while ((${numero}<= 0)) do echo -n "Has dentrar un nmero positiu:" read numero done while [[ ${comptador} -le ${numero} ]] do echo ${comptador} ((comptador+=2)) done echo n "Prmer qualsevol tecla per a continuar. read tecla clear exit 0 #-------------fi----------
Sistemes operatius
107
Un array s un variable que en un mateix moment hi podem guardar diferents tipus dinformacions. Sutilitza un ndex per indicar el lloc on situem la informaci dins de la variable. Aquest ndex comena pel valor zero.
Com en el cas dels shell scripts, lies i altres estructures de caracterstiques semblants, es poden utilitzar les funcions per reduir la quantitat de codi i per evitar recordar ordres o seqncies dordres complicades. Abans de fer servir una funci del shell, cal definir-la. En la taula 95, teniu informaci sobre la manera de gestionar les funcions.
Sistemes operatius
108
Taula 95. Format de les funcions crear/cridar/eliminar funcions 1) Creaci de les funcions: Format 1: nom_funci ( ) { ordre(s) } 2) Crida a funcions: nom_funci argument1 argument2...argumentn 3) Eliminar funcions: unset f nom_funci Objectiu Definir, cridar i eliminar una funci. Exemples de lordre function L () { ls l ; sleep 10 ; clear; } Resultat de lordre Definim una funci anomenada L. Aquesta funci visualitza els nom dels fitxers del lloc on estem i espera 10 segons abans desborrar la pantalla.
Per declarar una variable local en una funci cal declarar la variable a dins de la funci amb lordre typeset.
Les funcions del shell tamb es poden crear en un gui i utilitzar-les en el gui mateix. En aquests casos les funcions shell shan de declarar abans del bloc principal del gui. Quan dissenyem una funci, el shell la desa en la memria fins que sortim del shell. Per utilitzar una funci, cal escriure el nom de la funci seguida per qualsevol nombre de parmetres. En la taula 96, teniu informaci sobre la manera de cridar les funcions.
Taula 96. Format per a cridar les funcions nom_funci [arg1]...[argn] Format 1: nom_funci Format 2: nom_funci argument1 argument2...argumentn Format 3: variable=`nom_funci` o variable=$(nom_funci) Objectiu Cridar una funci del shell amb la possibilitat de passar-li arguments. Aquests arguments sn gestionats de la mateixa manera que en cas de pas darguments a guions (ho veurem ms endavant). Exemples de lordre escriure 34 67 Resultat de lordre Crida una funci anomenada escriure i li passa els arguments 34 i 67.
Qualsevol cosa que podem fer amb un gui podem fer-la amb una funci shell i viceversa. No obstant aix, hi ha algunes diferncies. Les funcions del shell sexecuten sempre dintre del seu propi entorn. Aix significa que les ordres duna funci poden afectar les variables, opcions, etc., del shell. El guions, en canvi, no afecten lentorn del shell. A ms, el shell desa les funcions directament en memria, per aix les funcions shi executen
Sistemes operatius
109
ms rpidament que els guions. El shell pot executar una funci immediatament, per per executar un gui ha de buscar el fitxer que cont el gui i llegir-lo. ! Com a norma general, les funcions del shell sn adequades per a coses que es fan servir sovint. Els guions, en canvi, sutilitzen ms en treballs poc freqents i tamb per a estructures amb un nombre elevat dinstruccions, ja que les funcions ocupen memria de lordinador. Tingeu pressent que una funci desapareix en el moment que deixem el shell en el qual havem definit la funci del shell.
Les funcions sn locals en el shell on estan definides. Una funci mai s visible en un subshell o en el shell pare dun gui en qu ha estat definida; en altres paraules, no existeix lordre export per a funcions.
Per manipular els parmetres posicionals passats a una funci durant la seva crida sutilitza el format $n (on n s un nmero que representa la posici).
Exemple de pas d'arguments en una funci Interpreteu l'execuci del segent gui. #!/bin/ksh # El nom del gui s: salutaci # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Aplicaci de funcions amb pas de parmetres # -------------Bloc Funcions------------------------function Hola ( ) { echo "Hola $1" } #-----------Final Funcions-------------------------#-------------------------Bloc Principal -------------------------clear Hola Josep echo n "Prmer tecla." read tecla clear exit 0 #-------------------------Final Principal -------------------------En executar el programa salutaci, largument Josep es passa a la funci i visualitza la paraula Josep. La variable $1 cont el valor posicional de Josep.
Les variables definides en un script o funcions sn globals, s a dir una vegada definides en el gui sn accessibles i modificables des de qualsevol lloc del gui.
Sistemes operatius
110
Exemple de funcions amb variables globals Interpreteu l'execuci del segent gui #!/bin/ksh # El nom del gui s: salutaci # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Aplicaci de funcions amb variables globals # -------------Bloc Funcions------------------------function aqu ( ) { on="Dins de la funci" } #-----------Final Funcions-------------------------#-------------------------Bloc Principal -------------------------clear on="En el gui" echo "$on" aqui echo "$on" echo n "Prmer tecla." read tecla clear exit 0 #-------------------------Final Principal -------------------------En executar el programa salutaci, obtenim: En el gui Dins de la funci Dins de la funci
Les funcions del shell poden retornar tamb valors destat igual que les ordres normals del sistema Unix. Per fer-ho, disposem de lordre return. En la taula 97, teniu informaci sobre la manera de retornar valors en una funci.
Taula 97. Format de l'ordre return return [valor] return [valor] Objectiu Retornar el valor de la funci del shell. Quan en una funci shell sespecifica lordre return, retorna immediatament fins i tot si hi ha ms ordres a continuaci en la funci. La variable valor representa el valor que sha retornat. Exemples de lordre return 0 Exemple daplicaci lordre return En aquest exemple teniu un cas prctic de laplicaci de lordre return. #!/bin/ksh # El nom del gui s: salutaci # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Aplicaci de funcions amb retorn de valors # -------------Bloc Funcions------------------------editar () { vi $1 if [ ${?} ne 0 ] then return 1 else Resultat de lordre Surt de la funci i retorna el valor 0.
Sistemes operatius
111
return 0 fi } #-----------Final Funcions-------------------------#-------------------------Bloc Principal -------------------------clear editar /prova if [[ ${?} eq 0 ]] then echo "Ledici ha anat sense cap problema" else echo "Hi ha hagut problemes amb ledici del fitxer" fi echo n "Prmer tecla." read tecla clear exit 0 #-------------------------Final Principal -------------------------Exemple daplicaci de lordre return en una funci Presentem la utilitzaci de lordre return en una funci dun gui. La paraula informtica no sescriu cap cop; en canvi, la paraula dilluns sescriu cinc vegades. #!/bin/ksh # El nom del gui s: retom # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Presenta la paraula dilluns cinc vegades, utilitzem lordre return # --------------------------------bloc de funcions--------------------visualitza () { echo $2 return 1 echo $1 } # -----------------------------Final Funcions------------------------# ---------------------------Bloc Principal--------------------------clear ((nombre=0)) while test ${nombre} -lt 5 do visualitza informtica dilluns ((nombre=${nombre}+1)) done echo -n "Final del procs. Premeu qualsevol tecla." read tecla clear exit 0 # -------------------------------Final Bloc principal-----------------
Els noms de funcions i definicions no sn heretades pels guions o per crides separades del ksh. Podem cridar les funcions tamb posant les definicions de funcions en un fitxer en qu el seu nom s el de la funci i situarlo en un directori definit per la variable FPATH o b definir les funcions en el fitxer dentorn (variable ENV). ! Per eliminar una funci podem utilitzar lordre unset f nom_funci.
!!
3.1.8. Pas de parmetres i la seva gesti en els guions del shell de Korn
El funcionament del pas de parmetres en el shell de K s el mateix que en el cas del shell de Bourne.
Per estudiar el pas de parmetres als guions consulteu el subapartat Pas de parmetres i la seva gesti en els guions del shell de Bourne de lapartat El shell de Bourne.
Sistemes operatius
112
Exemple de pas d'arguments a un gui Fixeu-vos en aquest exemple: suposem que ens demanen que dissenyem un gui que visualitzi la informaci "sistemes informtics: Unix". Una possible manera de fer-ho seria passar aquesta informaci al gui en forma darguments. Aix la manera dexecutar el gui seria: nom_gui sistemes informtics: Unix
El nom_gui correspon a largument0; sistemes, a largument1; informtics :, a largument2; i Unix, a largument3. Aix, si el gui sanomena pas, una possible estructura seria: #!/bin/ksh # El nom del gui s: pas # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # Exemple de pas de parmetres # ------------------------bloc principal -------------------------clear echo $1 $2$3 echo n "Prmer tecla." read tecla clear exit 0 # --------------------final----------------------------------------------
Per executar el gui anterior, cal escriure en la lnia dordres: pas sistemes informtics: Unix
Exemple de pas d'arguments a un gui Suposem que tenim el gui imprimir, que ens dna la possibilitat dimprimir el contingut de qualsevol fitxer de tipus ASCII. Lestructura del fitxer s: #!/bin/ksh # El nom del gui s: imprimir # La data de creaci: 17-05-07 # La persona que ha creat aquest gui s: jee # exemple de passar qualsevol nombre de parmetres # -----------------------------------------bloc principal -------------------------while [[ ${1} != "" ]] lpr $1 shift end echo -n "Final del procs. Premeu qualsevol tecla." read tecla clear exit 0 # --------------------------------------------------fi ---------------------------------------------------
Sistemes operatius
113
interactiu per a linici duna sessi (login shell), o com un shell no interactiu, en primer lloc es llegeix i sexecuten les ordres des de larxiu /etc/profile si existeix. Desprs busca el ~/.login, on podem definir i exportar les variables que interessi. Desprs executa el fitxer ~/.kshrc si existeix (on es defineixen els lies, etc.). Per sortir del shell de K sexecuta el fitxer ~.logout si existeix.
Exemples dels fitxers ~.login, ~.kshrc i ~.logout Aqu teniu uns exemples dels contingut dels fitxers ~.login, ~.kshrc i ~.logout: 1) ~.login PATH=/bin/posix:/usr/bin:/usr/lib:/bin:/users/josep/bin:. MAIL=/usr/mail/josep HOME=/users/josep EDITOR=/usr/bin/vi ENV==~/.kshrc TERM=hp2392 export ENV START EDITOR TERM PATH MAIL HOME if mail -e then echo "Tens missatges." fi PS1="$ " trap "$HOME/.logout" 0 # sexecuta shi ha el fitxer .logout
2) ~.kshrc # .kshrc # Korn Shell initialisation file # ls lies alias ls="ls --color=auto --time-style=+%d-%m-%Y\ %H:%M" alias ll=ls -l alias lla=ls -la alias ltr=ls -ltr alias llh=ls -l . | egrep htm\|html # vi lies alias vk=vi $HOME/.kshrc alias vp=vi $HOME/.profile
Sistemes operatius
114
Nom de lordre break builtin case cd command continue echo exec eval exec export exit fc function getopts hash hist if jobs kill let print printf pwd read
Nom de lordre select test time trap typeset ulimit umask unalias until unset wait while
Nom de lordre
readonly