You are on page 1of 114

Els shells del sistema Unix

Sistemes operatius

Sistemes operatius

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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 shells del sistema Unix

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

Els shells del sistema Unix

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 shells del sistema Unix

1. Intrprets dordres del sistema Unix. Shells de Bourne i de Bash

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.

1.1.1. Programa informtic


Heu de tenir molt clar el concepte de programa informtic.
Llenguatge mquina

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

Els shells del sistema Unix

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. !

1.1.2. Llenguatges de programaci


Donar ordres a lordinador utilitzant nmeros s molt complicat. Per sort, disposem duna gamma molt diversa de llenguatges de programaci que ens eviten el problema dhaver de treballar daquesta manera.

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 shells del sistema Unix

Els llenguatges dalt nivell sn ms propers al llenguatge natural (normalment lidioma angls) que al de la mquina.

1.1.3. Compiladors i intrprets


Exemples de llenguatges dalt nivell

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

Els shells del sistema Unix

Figura 1. Esquema de compilaci, dinterpretaci i de crida al sistema

1.1.4. Enlla i llibreries


El compilador transforma el fitxer escrit en codi font en un altre fitxer anomenat codi objecte, el qual no podem executar encara. Lltima operaci s lenlla del codi objecte per generar el codi executable. El programa que permet combinar diversos fitxers de codi objecte en un nic fitxer per formar un programa executable sanomena enllaador (linker).

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

Els shells del sistema Unix

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. !

1.1.5. Interfcies, crides al sistema i API


En aquest apartat no ens interessa el concepte d'interfcie amb relaci al maquinari, sin amb relaci al programari. Determinats mduls del programari (una llibreria, el mdul dun programa, un procs i el kemel i tot) ofereixen una interfcie de programaci.

API: application program interface.

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. !

1.2. Intrprets dordres

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

Els shells del sistema Unix

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.

CLI: command line interface.

NT: new technology. XP: eXPerience.

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

1.3. Els guions o els shell scripts


Tots els sistemes Unix ofereixen per defecte intrprets i compiladors de diferents llenguatges que sn necessaris per millorar el funcionament del sistema. Els intrprets de qu disposa el sistema Unix per defecte sn els shells o intrprets dordres, els quals serveixen per a molt ms que llanar programes escrivint el seu nom en el smbol del prompt del sistema. Els shells dels sistemes Unix es van plantejar com una eina que permetia escriure programes de forma rpida i senzilla, i desprs generar un codi executable ms rpid i compacte, normalment amb el llenguatge C.

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.

Un gui s un fitxer que cont entrades per a un shell determinat.

Sistemes operatius

16

Els shells del sistema Unix

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

1.3.1. Fases en la gesti dels guions


Les etapes que cal seguir per poder executar un gui concret en el sistema Unix sn les segents: 1) Creaci dun gui. Un gui s un fitxer en el qual hi ha totes les accions que ens permeten resoldre un problema determinat. Aquestes accions han destar indicades en el fitxer seguint les normes del shell utilitzat. La manera ms fcil de gestionar aquestes ordres s fent servir alguns dels editors (vi, ex, ed, emacs, vim, xemacs, etc.), que posa a la nostra disposici el sistema Unix. Totes les normes i orientacions en el disseny de programes shan daplicar en el disseny de guions. Com a recordatori podrem indicar les segents: Cal utilitzar metodologies modulars i estructurades. ! Els guions han de ser de fcil lectura i interpretaci. Les possibles modificacions shan de poder fer amb facilitat. s convenient comentar les parts principals del gui. Cal valorar els avantatges i inconvenients de la utilitzaci dun determinat shell. s convenient especificar el nom del gui, la data de gesti del gui, els noms i cognoms de les persones que han participat en la gesti del gui, i tamb incloure una petita descripci de la funci daquest gui.

Shell de Korn Shell de T

Sistemes operatius

17

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

1.4. El shell de Bourne


El shell de Bourne s el shell estndard del sistema Unix i es troba en totes les variants dUnix que avui podem trobar en el mercat informtic. Encara que es pot considerar com un subconjunt del shell de Bash, s molt utilitzat, perqu dna garanties de la portabilitat dels guions a les diferents plataformes dUnix. Aquest shell, a ms de poder-se emprar com a interfcie de lnia dordres, t estructures de programaci per fer blocs de seqncies dordres i automatitzar-les en un gui. Lintrpret de les ordres del shell de Boume s el fitxer sh, situat en el directori /bin. El shell de Bourne (sh) s compatible amb el shell de Bash. En molts sistemes Linux, quan sexecuta el shell de Bourne, automticament es crida el shell de Bash per la seva compatibilitat. Passa exactament el mateix quan sexecuta el shell de C, aquest crida automticament el shell de T (tcsh).

1.4.1. Histria del shell de Bourne


El shell de Bourne era el shell per defecte de la versi 7 dUnix, i va substituir el shell de Thompson en qu el seu executable tenia com a nom sh. Va ser desenvolupat per Stephen Bourne dels Laboratoris Bell dAT&T i

Sistemes operatius

19

Els shells del sistema Unix

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.

1.4.2. Informaci general sobre el shell de Bourne


Els elements bsics de la sintaxi dels guions per a un shell Bourne sn els segents: 1) Tipus de shell: la primera lnia en un gui que utilitza el shell de Bourne ha de ser: #!/bin/sh. En algunes distribucions dUnix tamb funciona el format #! /bin/sh (espai entre ! i /bin/sh). 2) Comentaris: si una lnia dun gui del shell de Boume comena amb el smbol #, el shell ignora tota la informaci que hi ha darrere del #. Aix permet inserir comentaris dintre dels guions. Hem assenyalat que s necessari comentar el gui, s a dir, indicar-ne el nom, la data de creaci, les persones que lhan dissenyat, la descripci, i identificar-ne els blocs principals. Podem posar tants comentaris com necessitem i en qualsevol lloc. En la taula 4, teniu informaci sobre la utilitzaci del intrpret sh i la manera de posar comentaris en un gui.
Taula 4. Indicar l'intrpret i posar comentaris en un gui Exemples dordres Resultat

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).

# El nom del gui s: prova

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 (>, <, >>, <>, &, <<). 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

Els shells del sistema Unix

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.

cat /alfa 1>/omega 2>&1

cat > /prova <<EOF

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

1.4.3. Gesti de les variables en el shell de Bourne


A ligual que en qualsevol programa informtic, en el shell de Bourne tamb podem utilitzar variables per desar el resultat duna ordre en el shell o lassignaci duna expressi en el gui.

Una variable shell s un nom que t valors o a la qual sen poden assignar.

Creaci i utilitzaci de variables


Una variable shell sempre ha de comenar per una lletra i tot seguit hi pot haver lletres, nombres i el carcter subratllat. En la taula 9, podeu veure com crear variables.
Taula 9. Crear variables nom_variable=expressio nom_variable=expressi 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 DIRECTORI la informaci / usr/josep.

Manipulaci de les variables


Per emprar el contingut duna variable, sha de posar el smbol $ abans del nom de la variable. En la taula 10, podeu veure com utilitzar les variables.
Taula 10. Manipular variables $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 Mart Balmes" echo $NOM NUMERO=123 echo $NUMERO 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 123. Visualitza el contingut de la variable NUMERO.

Sistemes operatius

24

Els shells del sistema Unix

$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

Els shells del sistema Unix

Nom de variable PWD PS2

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

CDPATH HOME IFS SHELL MAIL echo $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

Els shells del sistema Unix

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*************

Variables locals i globals


El valor duna variable pot ser diferent en el shell dUnix en qu estem treballant a cada moment. Un exemple seria la variable dentorn PATH. Durant el procs de connexi, PATH sinicialitza amb un determinat valor i que es passa a qualsevol subshell. Podem crear noves variables shell i modificar els valors daquelles que shagin agafat de lentorn. Per exemple, si redefinim la variable PATH i desprs comencem un nou shell, sassignar a aquest el valor original de PATH, i quan retornem al shell original els valors redefinits tomaran a ser efectius. En els sistemes Unix les variables poden ser globals i locals. En la taula 13, teniu informaci sobre la gesti de les variables globals i locals.

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

Els shells del sistema Unix

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.

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 i env per aconseguir-ho. En la taula 14, teniu informaci sobre la manera de visualitzar el nom i el contingut de les variables.
Taula 14. Visualitzar les variables i el seu contingut env/set 1) env 2) set Objectiu 1) Presenta el nom i el contingut de les variables de lentorn. 2) Presenta el nom i el contingut de totes les variables. Exemples de lordre env set Resultat de lordre Treu el nom i el contingut de les variables de lentorn. Per exemple PATH, SHELL, MAIL, etc. Treu el nom i el contingut de totes les variables. Per exemple PATH, SHELL, MAIL, DOG, DIRECTORI, etc.

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

Els shells del sistema Unix

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.

Entrada de dades en una variable shell


Lordre read ens permet entrar dades en les variables utilitzant lentrada estndard (teclat). En la taula 16, podeu veure la sintaxi lordre read.
Taula 16. Entrar a les variables via teclat read read nom_variable1...nom_variablen Objectiu Assignar valors a les variables utilitzant lentrada estndard (teclat). Si lusuari introdueix ms valors que el nombre de variables, lltima variable rep tots els valors en excs. Els separadors de les paraules estan determinats per la variable IFS. Exemples de lordre echo n "Entra el teu nom:" read NOM echo $NOM Resultat de lordre Apareix el rtol: Entra el teu nom:. El cursor se situa a continuaci i espera que entrem el nom duna persona i prmer <RETURN>. Seguidament s visualitza el contingut de la variable NOM.

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--------------------

1.4.4. Acabar un shell de Bourne


Una manera dacabar un shell s mitjanant lordre exit. Sabem que un gui sexecuta de manera seqencial i quan sexecuta lltima ordre, el

Sistemes operatius

29

Els shells del sistema Unix

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.

1.4.5. Estructures de control del shell de Bourne


A ligual que els llenguatges de programaci, el shell de Bourne permet treballar amb estructures de control de diferents tipus: estructures alternatives i estructures repetitives. En aquestes estructures shan davaluar determinades condicions per decidir quines accions shan de desenvolupar.

Sistemes operatius

30

Els shells del sistema Unix

Format de les condicions de les estructures de control


Les condicions de les estructures de control es poden expressar amb lordre test o especificant les condicions entre [ ]. En la taula 18, teniu informaci sobre el format de les condicions.
Taula 18. Format de les condicions test/[ ] test 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 sha de 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. 6) Operadors lgics: a) ! expressio: retorna veritat si el resultat 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 ] && [ condici.21 ]: 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 $? Retorna 1 ja que s falsa la condici. Resultat de lordre Retorna 0 ja que s veritat la condici.

Sistemes operatius

31

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

clear exit 0 #-------------fi--------------------

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

1.4.6. Expressions matemtiques del shell de Bourne


Algunes vegades ens podem trobar que hgim de fer operacions matemtiques de manera directa o amb variables. Lordre per fer-ho s expr (taula 28). Lordre expr calcula una expressi i presenta el resultat. Lexpressi pot ser un enter o una cadena. Hi ha diversos operadors que permeten a expr executar expressions aritmtiques, fer comparacions o prendre decisions senzilles.
Taula 28. Format de l'ordre expr expr expr expressi variable=`expr expressi ` Objectiu Manipular lexpressi indicada segons uns operadors determinats. Si volem guardar el resultat obtingut per expr, caldr especificar-ho entre accents greus. Expressi: valor/variable operador valor/variable Operadors: +: sumar. -: restar. *: multiplicar. /: dividir. %: resto divisi entera. length: retorna el nombre de carcters de lexpressi. Expressi1 \| expressi2: retorna lexpressi1 si cap s nul o zero. En cas contari retorna expressi2. Expressi1 \& expressi2: retorna lexpressi1 si ni expressi1 i ni expressio2 sn nulles o zero. En cas contrari retorna 0. Expressi1 =, \>, \>=, \<, \<=, != expressi2: retorna el resultat de la comparaci com un nombre enter si les dues expressions sn enteres. En cas contrari retorna com a resultat un string. Exemples de lordre A=25 B=10 C=`expr $A + $B` echo $C Resultat de lordre Visualitza el resultat de 35.

Sistemes operatius

40

Els shells del sistema Unix

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.

1.4.7. Funcions del shell de Bourne


Una funci del shell s un conjunt dordres del shell comparable a una subrutina dun llenguatge de programaci com el Pascal o el C. Per definir una funci, sespecifica el conjunt dordres que formen la funci i un nom per a aquesta. Quan una lnia dordre comena amb un nom de funci, el shell executa totes les ordres que formen la funci. Les funcions es poden executar dintre dels guions o en les sessions interactives normals.
Els lies sn noms que representen accions idntiques.

Les funcions del shell sn apropiades per a treballs repetitius.

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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 --------------------------

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 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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

done echo -n "Final del procs. Premeu qualsevol tecla." read tecla clear exit 0 # --------------------------------------------------fi ---------------------------------------------------

La manera dexecutar el gui podria ser:

sh ./imprimir a b c d e f g h i j k l m n o p q

Nota: a,b,...q, sn fitxers de tipus ASCII.

1.4.9. Guions dinici i de final de sessi en el shell de Bourne


Quan el shell de Bourne arrenca (comencem una sessi), executa les ordres que es troben en diferents guions. Quan sinvoca el shell com un shell interactiu per linici duna sessi (login shell) es llegeix i sexecuta ordres des de larxiu /etc/profile si existeix. El fitxer /etc/profile, sutilitza per crear un mateix entorn de treball per a tots els usuaris del sistema. Desprs busca, llegeix i executa les ordres del fitxer ~/.profile si existeix. El fitxer ~/.profile ens permet configurar un entorn especfic per a cada usuari.

Exemple dels fitxers /etc/profile i ~/.profile Aqu teniu uns exemples dels fitxers /etc/profile i ~/.profile

1) Fitxer: /etc/profile

# /etc/profile TERM=vt100 PS1="IES> " export TERM PS1

2) Fitxer: ~.profile

#!/bin/sh clear echo "Benvingut $LOGNAME"

1.4.10. Ordres de referncia del shell de Bourne


Els guions del shell de Bourne, igual que molts llenguatges de programaci, tamb disposen deines per fer un seguiment del funcionament dels guions. Una daquestes eines s lordre set. En la taula 35, teniu informaci sobre laplicaci de lordre set per fer els seguiments dels guions.

Sistemes operatius

48

Els shells del sistema Unix

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

1.5. El shell de Bash


Bash s un shell dUnix escrit pel projecte GNU. Els seu nom procedeix del de bourne again shell (un altre shell Bourne). Fins a lany 1978, el shell de Bourne era el shell distribut amb la versi 7 dUnix. Stephen Bourne, en aquells moments investigador dels Laboratoris Bell, va escriure el shell de Bourne original. Brian Fox va escriure el shell de Bash lany 1987. El 1990, Chet Ramey es va convertir en el seu principal desenvoluGNU GNU no s Unix (GNU is not unix). GNU s el nom dun projecte encapalat per Richard Stallman i basat en lobtenci duna versi del sistema Unix sota la filosofia del programari lliure.

Sistemes operatius

49

Els shells del sistema Unix

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.

1.5.1. Informaci general sobre el shell de Bash


Shan de tenir presents algunes normes per poder utilitzar correctament el shell de Bash: 1) Tipus de shell: la primera lnia en un gui que utilitza el shell de Bash ha de ser: #!/bin/bash. En algunes distribucions dUnix tamb funciona el format #! /bin/bash (espai entre ! i /bin/bash). 2) Comentaris: sutilitza la mateixa tcnica que en el shell de Bourne. Consulteu lapartat corresponent del shell de Bourne. En la taula 37, teniu informaci sobre la utilitzaci de lintrpret bash i la manera de posar comentaris en un gui.
Taula 37. Manera d'executar un gui i posar comentaris dins del gui Exemples dordres #! /bin/bash # El nom del gui s: prova Resultat Ajuda del shell de Bash Quan sexecuta aquest gui, sindica que el shell ha dutilitzar el shell de Bash (bash). Aix s una lnia de comentaris. Podem obtenir una llista de les ordres interns del shell de Bash a travs de lordre man builtin. Tamb podem obtenir ajuda sobre aquestes ordres a partir de lordre help nom_ordre.

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

Els shells del sistema Unix

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.

1.5.2. Gesti de les variables en el shell de Bash


A ligual que en qualsevol programa informtic, en el shell de Bash tamb podem utilitzar variables per desar el resultat duna ordre en el shell o lassignaci duna expressi en el gui.

Una variable shell s un nom que t valors o a la qual sen poden assignar.

Creaci i utilitzaci de variables


Una variable shell sempre ha de comenar per una lletra i tot seguit hi pot haver lletres, nombres i el carcter subratllat. Per assignar un valor a una variable sutilitza lexpressi que podeu veure en la taula 39.

Sistemes operatius

51

Els shells del sistema Unix

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.

Definici de variables: declare


Per definir variables en el shell de Bash podem utilitzar lordre declare (taula 40).
Taula 40. Definir una variable declare declare [ opcions ] nom_variable[=valor] Objectiu Permet declarar les variables. Opcions -a: variable de tipus array. -f: presenta les variables que sn funcions. -i: variables de tipus enter. -r: variables de lectura. -x: exporta la variable (equivalent a export) Exemples de lordre declare declare i numero Resultat de lordre Presenta totes les variables de lentorn. Declarem la variable nmero com a entera i aleshores podrem fer operacions aritmtiques amb aquesta. El resultat ser: 5*4

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

Manipulaci de les variables


Per emprar el contingut duna variable, sha de posar el smbol $ abans de la variable. En la taula 41, teniu informaci sobre la utilitzaci de variables.

Sistemes operatius

52

Els shells del sistema Unix

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.

%i: visualitza nombre enter.


%f: visualitza nombre en coma flotant.

%s: visualitza una cadena.


Exemples de lordre N=30 Nom=Josep printf "El client %d s %s" $N $Nom Resultat de lordre Visualitza: El client 30 s 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.

Sistemes operatius

53

Els shells del sistema Unix

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

HOME SHELL MAIL LINES, COLUMNS BASH_VERSION USER echo $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

Els shells del sistema Unix

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*************

Variables locals i globals

!!
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.

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 lordre set o env per aconseguir-ho.

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

Els shells del sistema Unix

Entrada de dades en una variable shell


Lordre read ens permet entrar dades en les variables utilitzant lentrada estndard (teclat).

!!
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--------------------

1.5.3. Acabar un shell de Bash


Una manera dacabar un shell s mitjanant lordre exit. Un gui sexecuta de manera seqencial i quan sexecuta lltima ordre, el 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.

!!
Per estudiar el funcionament de lordre exit consulteu el subapartat Acabar un shell de Bourne de lapartat El shell de Bourne.

1.5.4. Estructures de control del shell de Bash


De la mateixa manera que els llenguatges de programaci, el shell de Bash permet treballar amb estructures de control de diferents tipus: estructures alternatives i estructures repetitives. En aquestes estructures sha davaluar determinades condicions per decidir quines accions shan de desenvolupar.

Format de les condicions de les estructures de control


Les condicions de les estructures de control es poden expressar amb lordre test o especificant les condicions entre [ ] , [[ ]] i (( )). En la taula 45, teniu informaci sobre el format de les condicions.

Sistemes operatius

56

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

1.5.5. Expressions matemtiques del shell de Bash


De vegades ens podem trobar que hgim de fer operacions matemtiques de manera directa o amb variables. Les ordres per fer-ho sn: expr let (taula 46)
Taula 46. Format de l'ordre let let let var=expressi Objectiu Permetre assignar el resultat duna expressi aritmtica a una variable. Podem utilitzar els operadors: +, -, *, / i %. Exemples de lordre declare i numero let numero=4*5 echo $numero declare i x let x=(9*5)/5 echo $x Visualitza el valor de 9. Resultat de lordre Visualitza el valor de 20. Per estudiar el funcionament de lordre expr consulteu el subapartat Expressions matemtiques 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

Els shells del sistema Unix

(( ))/[[ ]] 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

Els shells del sistema Unix

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.

if ((VAR= =Y * 3 + X * 2)) then echo $i fi ((Z > 23)) && echo $i

Si es compleix la condici visualitza el contingut de la variable i.

Si el contingut de Z s ms gran de 23, visualitza el contingut de la variable i.

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

Els shells del sistema Unix

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----------

1.5.6. Arrays del shell de Bash


Normalment, sutilitzen variables diferents per gestionar diferents informacions. Tamb, podem utilitzar una mateixa variable per guardar diferents informacions.

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

Els shells del sistema Unix

En la taula 49, teniu informaci sobre la utilitzaci dels arrays.


Taula 49. Format dels arrays arrays Declarar un Array: declare a C Assignar valors: C=([0]=Mel [1]=Taronja [2]=Pera) / C[0]=Mel C[1]=Taronja C[2]=Pera / C=( Mel Taronja Pera ) Accedir: C[2] Objectiu Assignar diferents valors a una mateixa variable. Exemples de lordre declare a NOM NOM=([0]=Josep [1]=Joan [2]=Anna) for ((i=0; i<3; i++)) do echo ${NOM[$i] } done declare a vector vector= ( 0 0 0 0 0 ) for ((i=0; i<=4 ; i++)) do echo n ".Entra un nmero:" read vector[$i] done Permet entrar cinc nmeros en la variable vector. Resultat de lordre Visualitza els noms de larray.

Actualment bash noms suporta treballar amb arrays unidimensionals (un nic ndex).

1.5.7. Funcions del shell de Bash


Les funcions del shell de Bash tenen el mateix significat i estructura que les definides en el shell de Bourne. En el shell de Bash podem aconseguir que una variable no posicional sigui local en una funci. Per fer-ho hem dutilitzar lordre local. En la taula 50, teniu informaci sobre la utilitzaci de les variables locals en funcions.
Taula 50. Variables locals en una funci local local nom_variable=valor Objectiu Definir una variable com a local en una funci. Exemples de lordre #!/bin/bash function aqu ( ) { local on="Dins de la funci" echo $on } clear on="En el gui" echo "$on" aqui echo "$on" exit 0 Resultat de lordre En executar aquest gui obtenim: En el gui Dins de la funci En el gui

!!
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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Nota: a,b,...q, sn fitxers de tipus ASCII.

1.5.9. Guions dinici i de final de sessi en el shell de Bash


Quan el shell de Bash arrenca (comencem una sessi), executa les ordres que es troben en diferents guions. Quan sinvoca el shell com un shell interactiu per a linici duna sessi (login shell), o com un shell no interactiu, en primer lloc es llegeixen i sexecuten ordres des de larxiu /etc/profile si existeix. Desprs busca ~/.bash_profile, ~/.bash_login i ~/.profile, en aquest ordre, els llegeix i executa les ordres des del primer que existeix i s llegible. Quan el login shell acaba, bash llegeix i executa les ordres de ~/.bash_logout si existeix. Quan un usuari arrenca un subshell (executem bash), bash llegeix i executa ordres des de ~/.bashrc si existeix.
Exemple de fitxer ~/.bash_profile Aqu teniu un exemple del contingut del fitxer ~/.bash_profile: # .bash_profile # Obtenir lies i funcions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # Especificar variables dentorn i programes BASH_ENV=$HOME/.bashrc USERNAME="" PATH=$PATH:/usr/local/pgsql/bin MANPATH=$MANPATH:/usr/local/pgsql/man PGLIB=/usr/local/pgsql/lib PGDATA=/usr/local/pgsql/data export USERNAME BASH_ENV PATH MANPATH PGLIB PGDATA

.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

Els shells del sistema Unix

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

1.5.10. Ordres de referncia del shell de Bash


Els guions del shell de Bash, igual que molts llenguatges de programaci, tamb disposen deines per fer un seguiment del funcionament dels guions. Aquestes eines sn a partir de la prpia crrega del shell de Bash (bash) o de lordre set. En la taula 51, teniu informaci sobre laplicaci del format del shell de Bash i de lordre set per fer seguiments als guions.
Taula 51. Format ordres bash i set bash/set bash opcions set o opcions Objectiu Permetre fer un seguiment de lexecuci dun gui. Les opcions sn activades quan van precedides del signe i anullades quan van amb el signe + en el cas de lordre set. s convenient utilitzar aquesta ordre dins dels guions. Opcions de set noexec verbose xtrace Opcions de bash -n -v -x Significat no executa les ordres, noms comprova la seva sintaxi. visualitza les ordres abans dexecutar-les. visualitza les ordres a interpretar i les diferents expansions que es realitzen abans dexecutar-lo. Resultat de lordre Visualitza les ordres a interpretar i les diferents expansions que es realitzen abans dexecutar el gui alfa.

Exemples de lordre bash x alfa

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

2.1. Els shells de C i de T


El shell de C, conegut com a csh, va ser desenvolupat per Bill Joy a la Universitat de Berkeley (California). El programa executable daquest shell s a larxiu /bin/csh. Quan el fem servir, en alguns sistemes Unix veurem un indicador representat pel smbol %. La sintaxi del shell de C s molt semblant al llenguatge de programaci C. s per aix que alguns guions que corren sota el shell de C no corren sota els shells de Bourne, Korn i Bash. El shell de T s un shell dUnix compatible amb el shell de C. Lintrpret el forma el fitxer /bin/tcsh. Lorigen del shell de T ve de la lletre T de TENEX; un sistema operatiu creat per Ken Greer i autor del tcsh. Ken Greer va estar treballant des de finals dels anys 70 a la Universitat Carnegie Mellon. Paul Placeway de la Universitat Ohio State va continuar els treballs en la dcada dels 80 i des de aleshores molta gent ha fet el manteniment daquest shell. Wilfredo Sanchez enginyer del Mac OS X ha estat treballant en el tcsh des dels comenaments dels anys 90 en el MIT.
Les sigles MIT corresponen a lInstitut Tecnolgic de Massachusetts.

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.

2.1.1. Informaci general sobre els shells de C i de T


Shan de tenir en compte algunes normes per poder utilitzar correctament els shells de C i de T: 1) Tipus de shell: la primera lnia en un gui que utilitza el shell de C ha de ser: #!/bin/csh i en shell de T; #!/bin/tcsh. En algunes distribucions dUnix tamb funciona el format #! /bin/csh (espai entre ! i /bin/csh). 2) Comentaris: sutilitza la mateixa tcnica que en el shell de Bourne. En la taula 53 teniu informaci sobre la utilitzaci dels intrprets dels shells de C i de T, i la manera de posar comentaris en un gui.

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

2.1.2. Gesti de les variables en els shells de C i de T


Ligual que en qualsevol programa informtic, en els shells de C i de T, tamb podem utilitzar variables per desar el resultat duna ordre en el shell o lassignaci duna expressi en el gui.

Creaci i utilitzaci de variables


Una variable shell sempre ha de comenar per una lletra i tot seguit hi pot haver lletres, nombres i el carcter subratllat. Per assignar un valor a una variable sutilitza lordre set (taula 57).
Taula 57. Format de l'ordre set set 1) set nom_variable = expressi 2) set 3) set nom_variable = ( valor1 valor2 ... valorn ); set nom_variable[ndex] = expressi 4) unset nom_variable

Sistemes operatius

71

Els shells del sistema Unix

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

Els shells del sistema Unix

Operadors *= valor /= valor %= valor ^= valor

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.

Exemple @ cont *= 3 @ cont /= 3 @ cont %= 3 @ cont ^= 3

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.

Manipulaci de les variables


Per emprar el contingut duna variable, sha de posar el smbol $ abans de la variable. En la taula 60, teniu informaci sobre la utilitzaci de variables.
Taula 60. Format per 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 set nom = Josep Mas echo $nom @ numero = 123 echo $numero euros @ numero = 23 @ numero = $numero + 20 echo $numero set setmana = (dilluns dimarts dimecres dijous divendres dissabte diumenge) echo $setmana[0] Treu dilluns. Resultat de lordre Assigna a la variable nom la informaci de lexpressi. Visualitza el contingut de la variable nom. Assigna a la variable nmero el valor 123. Visualitza el contingut de la variable nmero i afegint la paraula euros. Treu 43.

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

Els shells del sistema Unix

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

Els shells del sistema Unix

#!/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.

echo $# i echo $#argv

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

Els shells del sistema Unix

Variables locals i globals


El concepte de variables locals i globals en els shells de C i de T, s el mateix que en el shell de bourne. Sutilitza lordre setenv (taula 63) per fer que una variable local sigui global.
Taula 63. Format de l'ordre setenv setenv setenv [nom_variable] [valor] Objectiu Visualitzar la llista de totes les variables de lentorn. Permetre exportar variables. Exemples de lordre setenv setenv home shell setenv path "/bin:/usr/bin:/usr/sbin:ucb/bin" Resultat de lordre Visualitza la llista de totes les variables de lentorn Exporta les variables home i shell. Assigna a la variable path els valors indicats i exporta la variable.

!!
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

Els shells del sistema Unix

# -----------------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--------------------

2.1.3. Acabar un shell de C i un shell de T


Una manera dacabar un shell s mitjanant lordre exit. Sabem que un gui sexecuta de manera seqencial i quan sexecuta lltima ordre, el 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.

!!
Per estudiar el funcionament de lordre exit consulteu el subapartat Acabar un shell de Bourne de lapartat El shell de Bourne.

2.1.4. Estructures de control en els shells de C i de T


De la mateixa manera que els llenguatges de programaci, els shells de C i de T, permeten treballar amb estructures de control de diferents tipus: estructures alternatives i estructures repetitives. En aquestes estructures shan davaluar determinades condicions per decidir quines accions shan de desenvolupar.

Format de les condicions de les estructures de control


Les condicions de les estructures de control es poden expressar amb ( ). En la taula 65, teniu informaci sobre el format de les condicions.
Taula 65. Format de les condicions () (condici) Objectiu Comprovar el format de la condici. Retorna un valor destat que indica si el format de la condici s veritat o fals. 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) -f fitxer: retorna veritat si el fitxer existeix i t informaci. h) -o fitxer: retorna veritat si el fitxer existeix i el propietari s lusuari del procs.

Sistemes operatius

77

Els shells del sistema Unix

() 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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

# ----------------------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

Els shells del sistema Unix

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.

2.1.5. Expressions matemtiques en els shells de C i de T


De vegades ens podem trobar que hgim de fer operacions matemtiques de manera directa o amb variables. Lordre per fer-ho s @.
Exemple d'aplicaci d'expressions matemtiques Utilitzant el shell de T, dissenyem un gui anomenat repetir que ens pregunti nombres fins que entrem el nombre -1. #!/bin/tcsh # El nom del gui s: repetir

!!
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

Els shells del sistema Unix

# 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-----------------------------

Exemple d'aplicaci d'estructures repetitives

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------------

Exemple d'aplicaci d'estructures repetitives

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

Els shells del sistema Unix

2.1.6. Arrays dels shells de C i de T


Normalment, sutilitzen variables diferents per gestionar diferents informacions. Tamb, podem utilitzar una mateixa variable per guardar diferents informacions.

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.

En la taula 71, teniu informaci sobre la utilitzaci dels arrays.


Taula 71. Format de l'ordre arrays arrays set nom_array = (valor1 valor2 ... valorn) @ nom_array = (valor1 valor2 ... valorn) Per accedir a una variable array cal utilitzar el segent format: nom_array[posici]. Objectiu Assignar diferents valors a una mateixa variable. Exemples de lordre set nom = (Josep Joan Anna) foreach i (1 2 3) echo $nom[$ i] done Resultat de lordre Visualitza els noms de larray.

2.1.7. Pas de parmetres i la seva gesti en els guions dels shells de C i de T


El funcionament del pas de parmetres en els shells de C i de T s el mateix que en el cas del shell de Bourne.
Exemple del 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

!!
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

Els shells del sistema Unix

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 ---------------------------------------------------

La manera dexecutar el gui podria ser: csh imprimir a b c d e f g h i j k l m n o p q

Nota: a,b,...q, sn fitxers de tipus ASCII.

2.2. Guions dinici i de final de sessi en els shells de C i de T


Quan el shell de C arrenca (comencem una sessi), executa les ordres que es troben en diferents guions. Quan sinvoca el shell com un shell interactiu per linici duna sessi (login shell), o com un shell no interactiu en primer lloc es llegeix i sexecuten les ordres des del arxiu /etc/ login o /etc/.login si existeixen. Desprs busca ~/.cshrc o ~/.login, en aquest ordre i llegeix i executa les ordres des del primer que existeix i s llegible. Per sortir del shell de C executa el fitxer .logout si existeix. El fitxer .login sexecuta quan comencem la sessi per primera vegada i .cshrc sexecuta cada vegada que sobre una sessi en el shell de C (obertura duna finestra).
Exemple dels fitxers ~/.cshrc, .login i .logout Aqu teniu uns exemples dels contingut dels fitxers ~/.cshrc, .login i .logout: 1) Exemple del fitxer .cshrc

Sistemes operatius

85

Els shells del sistema Unix

#!/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

Els shells del sistema Unix

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

2.3. Ordres de referncia


En la taula 72, teniu els noms de les principals ordres que podeu utilitzar en els shells de C i de T.
Taula 72. Resum dels noms de les principals ordres dels shells de C i T Nom de lordre alias break braksw case cd chdir continue echo end endif endsw eval exec exit foreach goto history if jobs kill logout notify onintr popd push rehash repeat set setenv shift source stop suspend switch Nom de lordre time trap umask unalias unhash unset unsetenv wait which while @ Nom de lordre

En la taula 73 teniu informaci dalgunes ordres especfiques del shell de T.


Taula 73. Resum dels noms d'algunes especfiques del shell de T Nom de lordre bindkey bye complete dirs hup inlib log migrate Nom de lordre telltc uncomplete universe ver Nom de lordre

Sistemes operatius

87

Els shells del sistema Unix

Nom de lordre echotc filetest getspath history newgrp nice

Nom de lordre warp where which

Nom de lordre

printenv sched

Sistemes operatius

88

Els shells del sistema Unix

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.

3.1.1. Informaci general del shell de Korn


Per poder utilitzar correctament el shell de K, shan de seguir algunes normes: 1) Tipus de shell: la primera lnia en un gui que utilitza el shell de K ha de ser: #!/bin/ksh. En algunes distribucions dUnix tamb funciona el format #! /bin/ksh (espai entre ! i /bin/ksh). En la taula 74, teniu un exemple sobre la utilitzaci del intrpret del shell de K.
Taula 74. Manera d'executar un gui i posar comentaris dins del gui Exemples dordres #! /bin/ksh # El nom del gui s: prova Resultat Quan sexecuta aquest gui, sindica que el shell ha dutilitzar el shell de K (ksh). Aix s una lnia de comentaris.

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

3.1.2. Gesti de les variables en el shell de Korn


De la mateixa manera que en qualsevol programa informtic, en el shell de K, tamb podem utilitzar variables per desar el resultat duna ordre en el shell o lassignaci duna expressi en el gui.

Creaci i utilitzaci de variables


Una variable shell sempre ha de comenar per una lletra i tot seguit hi pot haver lletres, nombres i el carcter subratllat. Per assignar un valor a una variable podem utilitzar els formats indicats en la taula 77, on teniu informaci sobre la manera de crear, visualitzar i eliminar variables.
Taula 77. Format per gestionar les variables set 1) nom_variable=expressi 2) set 3) unset nom_variable Objectiu 1: assignar un valor a una variable. 2: visualitzar les variables de lentorn i els seus valors. 3: eliminar una variable. Exemples de lordre nom="Josep Mart Balmes" nom= informtica unset nom Resultat de lordre Assigna a la variable nom la informaci de lexpressi. Assigna a la variable nom la paraula informtica. Elimina la variable nom.

Manipulaci de les variables


Per emprar el contingut duna variable, sha de posar el smbol $ abans de la variable. En la taula 78, teniu informaci sobre la utilitzaci de variables.
Taula 78. Format per a la manipulaci de variables $nom_variable 1) $nom_variable 2) ${nom_variable}

Sistemes operatius

91

Els shells del sistema Unix

$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.

Definici de variables: typeset


Per definir variables en el shell de K podem utilitzar lordre typeset (taula 80).
Taula 80. Format de l'ordre typeset typeset typeset [ opcions ] nom_variable[=valor] Objectiu Permet declarar les variables. Opcions -E o -En: punt flotant, notaci cientfica (noms disponible en versions de ksh posteriors a la versi ksh88). -F o Fn o float: punt flotant (noms disponible en versions de ksh posteriors a la versi ksh88). -i o integer: variables de tipus enter. -A: variables de tipus array associatiu (noms disponible en versions de ksh posteriors a la versi ksh88). -r: variable noms de lectura (constant). -x: variable exportada. Exemples de lordre typeset i numero Resultat de lordre Declarem la variable numero com a entera i aleshores podrem fer operacions aritmtiques amb . En un array associatiu, lndex pot ser una cadena arbitrria.

Sistemes operatius

92

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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*************

Variables locals i globals


El concepte de variables locals i globals en el shell de K, s el mateix que en el shell de Bourne. Sutilitza lordre export per fer que una variable local sigui global.

!!
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.

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 i typeset.

Sistemes operatius

95

Els shells del sistema Unix

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.

Entrada de dades en una variable shell


Lordre read ens permet entrar dades en les variables utilitzant lentrada estndard (teclat).
Exemple d'utilitzaci de l'ordre read Dissenyem un gui anomenat prova15 utilitzant el shell de K, que ens pregunti el nom i cognoms, seguidament ha de visualitzar la informaci entrada. #!/bin/ksh # El nom del gui s: prova15 # 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 el teu primer cognom?:" read cognom1 echo -n "i el teu segon cognom?: " read cognom2 echo El meu nom i cognoms sn: $nom, $cognom1, $cognom2" sleep 10 clear # ----------------fi--------------------

3.1.3. Acabar un shell de Korn


Una manera dacabar un shell s mitjanant lordre exit. Sabem que un gui sexecuta de manera seqencial i quan sexecuta lltima ordre, el 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.

!!
Per estudiar lordre exit consulteu el subapartat Acabar un shell de Bourne de lapartat El shell de Bourne.

3.1.4. Estructures de control del shell de Korn


De la mateixa manera que els llenguatges de programaci, el shell de K permet treballar amb estructures de control de diferents tipus: estructures alternatives i estructures repetitives. En aquestes estructures shan davaluar determinades condicions per decidir quines accions shan de desenvolupar.

Sistemes operatius

96

Els shells del sistema Unix

Format de les condicions de les estructures de control


Les condicions de les estructures de control es poden expressar amb test, [ ], [[ ]] i (( )). En la taula 83, teniu informaci sobre el format daquestes condicions.
Taula 83. 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 est 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. 6) Operadors lgics: a) ! expressio: retorna veritat si el resultat 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 ] && [ condici.21 ]: 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 $? Resultat de lordre Retorna 0 ja que s veritat la condici.

Sistemes operatius

97

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

#!/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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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.

3.1.5. Expressions matemtiques en els shells de Korn


Algunes vegades ens podem trobar que hgim de fer operacions matemtiques de manera directa o amb variables. Les ordres per fer-ho sn: expr. let (taula 92).
Taula 92. Format de l'ordre let let let var=expressi Objectiu Permetre assignar el resultat duna expressi aritmtica a una variable. Exemples de lordre let numero=4*5 echo ${numero} let x=(9*5)/5 echo ${x} Visualitza el valor de 9. Resultat de lordre Visualitza el valor de 20.

!!
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

Els shells del sistema Unix

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

Els shells del sistema Unix

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----------

3.1.6. Arrays en el shell de Korn


Normalment, sutilitzen variables diferents per gestionar diferents informacions. Tamb podem utilitzar una mateixa variable per guardar diferents informacions.

Sistemes operatius

107

Els shells del sistema Unix

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.

En la taula 94, teniu informaci sobre la utilitzaci dels arrays.


Taula 94. Format dels arrays arrays nom_array[ndex]=valor Per accedir a una variable array cal utilitzar el segent format: nom_array[posici]. Objectiu Assignar diferents valors a una mateixa variable. Exemples de lordre typeset nom[3] nom[0] = Josep nom[1] = Joan nom[2] = Anna for i in 0 1 2 do echo ${nom[$ i]} done Resultat de lordre Visualitza els noms de larray nom.

3.1.7. Funcions del shell de Korn


Una funci del shell s un conjunt dordres del shell comparable a una subrutina dun llenguatge de programaci com Pascal o C. Per definir una funci, sespecifica el conjunt dordres que formen la funci i un nom per a aquesta. Quan una lnia dordres comena amb un nom de funci, el shell executa totes les ordres que formen la funci. Les funcions es poden executar dintre shell scripts o en les sessions interactives normals.

Les funcions del shell sn apropiades per a treballs repetitius.

Els lies sn noms que representen idntiques accions.

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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

Els shells del sistema Unix

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 ---------------------------------------------------

La manera dexecutar el gui podria ser: ksh imprimir a b c d e f g h i j k l m n o p q

Nota: a,b,...q, sn fitxers de tipus ASCII.

3.2. Guions dinici i de final de sessi


Quan el shell de K arrenca (comencem una sessi), executa les ordres que es troben en diferents guions. Quan sinvoca el shell com un shell

Sistemes operatius

113

Els shells del sistema Unix

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

3) ~.logout clear echo "Que tinguis un bon dia".

3.3. Ordres de referncia


En la taula 98, teniu els noms de les principals ordres que podeu utilitzar en el shell de K.
Taula 98. Resum dels noms de les principals ordres del shell de Korn Nom de lordre alias bg fg for Nom de lordre return set Nom de lordre

Sistemes operatius

114

Els shells del sistema Unix

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

You might also like