Programant en Bash - part 1

Si bé ho fem servir generalment per a operacions administratives o de gestió d'arxius, la consola de Linux estén la seva funcionalitat molt més enllà d'aquest propòsit, i ens permet programar scripts d'acord amb les nostres necessitats. Aquesta guia no pretén ser una referència completa sobre la programació a Bash, sinó una introducció a les ordres i estructures bàsiques, la qual cosa ens permetrà ampliar el poder del nostre sistema GNU/Linux.

Què és un “Script”?

Bàsicament diem que és un fitxer que conté codi escrit en determinat llenguatge de programació que el sistema utilitza per a determinada tasca. No cal que tingueu una entrada externa ni interfície gràfica, però sí que provoqueu una sortida de dades processades (per més que l'usuari no les vegi).

El llenguatge usat per Bash està definit pel seu propi intèrpret i combina la sintaxi d'altres Shells, com el Korn Shell (ksh) o el C Shell (csh). Moltes de les ordres que usualment s'usen a la consola també poden usar-se en els scripts, excepte aquells que pertanyen estrictament a una distribució en particular.

Estructura d'un Script

Per començar, hem de comptar amb un editor de text i ganes de programar. Els fitxers que guardem amb extensió .sh podran ser executats (o interpretats) per la consola, sempre que la primera línia sigui la següent:

#! / Bin / bash

Això diu al sistema que haureu d'usar la consola per executar el fitxer. A més, el caràcter # permet escriure comentaris. Per crear l'exemple més simple afegim una línia més, vista a la imatge següent:

La comanda feta mostra un missatge en pantalla, en aquest cas el típic “Hello world!”. Si el guardem i executem amb la consola veurem el resultat.

ordres bàsiques

Les ordres següents són comunes i molt útils per a qualsevol tipus de programa. Aclarim que n'hi ha molts més, però per ara cobrirem els següents.

Àlies: permet que una cadena de paraules sigui substituïda per una de més curta, permetent la reducció del codi.

#creem un àlies anomenat per amb l'adreça de la #carpeta

break: permet sortir immediatament d'un cicle for, while, until o select (més endavant estudiarem detalladament els cicles)

#Creem un cicle que assignarà els números de l'1 al 5 #per cada “volta de cicle” for comptador in 1 2 3 4 5 do #Imprimim l'actual valor de la variable #comptador, el qual és analitzat pel caràcter $ echo “ $comptador” #Si el valor de comptador és igual a 3 if [$comptador –eq 3] then #El break surt del cicle for break fi done

continue: semblant al break, excepte que ignora l'actual volta de cicle i passa a la següent.

#Creem un cicle que assignarà els números de l'1 al 5 #per cada “volta de cicle” for comptador in 1 2 3 4 5 do #Si el valor de comptador és igual a 3 if [$comptador –eq 3] then #Continue impedeix que s'analitzi la resta del cicle #actual saltant a la volta següent, o sigui que el #valor 3 no s'imprimirà. continue fitxer “$comptador” done

declareu: declara variables i els assigna valors, igual que typeset (funcionen de la mateixa manera). Podem combinar-la amb algunes opcions: -i declara números sencers; -r per a variables de només lectura, a les quals no se'ls podrà canviar el valor; –a per a matrius o “arrays”; -f per a funcions; -x per a variables que podran ser exportades fora de l'ambient de l'script propi.

declareu –i num=12 declareu –x pi=3.14

help: mostra l'ajuda d'una ordre concreta.

jobs: mostra els processos en execució.

#Amb –c mostrem el nom de les ordres, amb –p #el pid (id de procés) de cada procés. jobs -cp

let: avalua una expressió aritmètica

let a=11 let a=a+5 #Finalment imprimim el valor de què és 16 fet “11 + 5 = $a”

local: crea variables locals, les quals han de ser utilitzades preferentment en funcions del propi scripts per evitar errors. Podeu utilitzar les mateixes funcions de l'ordre declareu.

local v1=”Aquesta és una variable local”

logout: permet sortir de l'inici de sessió d'un Shell completament; útil per als casos on treballem amb més d'una finestra de Shell, en els quals la comanda exit només permetrà finalitzar una finestra alhora.

printf: permet imprimir una dada i donar-li format. Compta amb moltes opcions, així que en mencionarem algunes.

# %f imprimeix com a número flotant, n per a nova #línia printf “%fn” 5 5.000000 # &d permet passar números decimals com a arguments printf “Hi ha %d comandes valuades en %d dòlars.n” 20 500 Hi ha 20 comandes valuades en 500 dòlars.

read: llegeix una línia de standard input (mòdul usat a la càrrega de dades per mitjà del teclat per exemple). Podem passar opcions com: -t per donar un temps límit de lectura; -a perquè cada paraula sigui assignada a una posició de l'array aname; -d per fer servir un delimitador que s'escriurà al final de la línia; entre d'altres.

echo “Ingressa el teu nom i pressiona ENTER” #Llegim la variable nom read nom echo “El teu nom és $nom”

type: descriu una ordre i el seu comportament. Pot ser útil per esbrinar les definicions de dades de cada ordre.

type –a '[' #type ens diu que [ és una ordre builtin de l'Shell [ is a Shell builtin # -a permet trobar els directoris que contenen #un executable amb el nom escrit. [ is /usr/bin/[

ulimit: limita l'accés i l'ús de certs recursos del sistema als processos, ideal per a programes que permeten fer canvis administratius o orientats a diferents tipus d'usuaris. En establir un límit escrivim un número que representa els kilobytes del límit.

#Veiem els nostres límits actuals ulimit –a # -f permet limitar els usuaris perquè no puguin #crear fitxers més grans que 512000 Kb (500 #Mb) ulimit –f 512000 # -v limita la memòria virtual del procés. ulimit –v 512000

wait: espera que es realitzi determinat procés o treball per continuar.

#El script espera que es realitzi el procés de pid #2585

espera 2585

Altres ordres útils que podem afegir als scripts estan representats per símbols.

!!: executa novament el darrer comandament

!wer: executa l'última ordre que començava amb l'expressió “wer”.

'==', '!=', '>', '< ', '>=', i '< =': operadors relacionals.

|: l'operador OR usat generalment per unir dues expressions regulars.

: ordre d'escapament que permet formatar les expressions. Per exemple: a per a una alerta de so, n per a nova línia, b per a la reculada, etc.

Gràcies Juan Carlos Ortiz!