Skip to content
Gallery
Scripts en GNU/Linux
Share
Explore
Scripts en GNU/Linux

icon picker
Apunts

Introducció

Un script és un fitxer de text que conté un comando en cada línia. Executar un script equival a escriure en la consola els comandos que conté un darrere l’altre.
Per a crear un script en GNU/Linux simplement obrim un editor de text i escrivim el seu codi, per exemple:
Aquest scrit simplement mostra per consola el text “Hola, Mundo!”. La primera linia sempre indica el shell o intèrpret de comandos que volem que execute aquest script.
Ara el guardem amb el nom que vulguem i extensió .sh.
Per a executar-lo tenim 2 opcions:
li ho pasem com a paràmetre d’un shell, per exemple:
li donem al fitxer permisos d’execució i l’executem directament, però incloent la seua ruta:

Variables

Podem definir variables asignant-les un valor:
Per a accedir al seu contingut anteposem al seu nom el caràcter $:
Podem incloure comentaris anteposant el símbol #.
Per a demanar un valor a l’usuari utilitzem read:

Pas de paràmetres

Quan executem un scrip podem pasar-li paràmetres des de la línia de comandos. Aquest paràmetres es guardaran en unes variables anomenades $1 per al primer, $2 per al segon, etc.
En la variable $* tenim tots els paràmetres junts i en $# el compte dels paràmetres pasats.
Per exemple, si execute ./lista_nombres.sh Juan Marta Eva Pep sobre el següent script:
el resultat serà:

Estructura condicional “if”

L’estructura de control if s’utilitza per prendre decisions basades en una condició. Si la condició especificada és certa, s’executa un bloc de codi i si no, s’executa un altre bloc de codi o es salta completament. La forma bàsica d’una sentència if és la següent:
La condició en un “if” pot ser qualsevol expressió que retorni un valor cert o fals. Pots utilitzar operadors i comparadors per construir condicions.

Operadors que podem utilitzar en la condició

Els operadors són diferents segons el tipus de les dades que estem comprovant. Alguns dels més comuns són:

Operadors de comparació de cadenes

=: Igual a
!=: No igual a
Exemple:

Operadors de comparació de números

-eq: Igual a
-ne: No igual a
-lt: Menor que
-le: Menor o igual que
-gt: Major que
-ge: Major o igual que
Exemple:

Operadors lògics

-a: “i” lògic (AND)
-o: “o” lògic (OR)
!: Negació lògica (NOT)
Exemple:

Operadors de comprovació d’arxius

-e: Comprova si un arxiu o directori existeix.
-f: Comprova si existeix i és un arxiu.
-d: Comprova si existeix i -es un directori.
-s: Comprova si un arxiu existeix i no està buit.
-r: Comprova si tenim permisos de lectura sobre el fitxer o directori
-w: Comprova si tenim permisos d’escriptura sobre el fitxer o directori
-x: Comprova si tenim permisos d’execució sobre el fitxer o directori
Exemples:

Anidació de sentències “if”

Pots anidar múltiples sentències “if” per gestionar condicions més complexes. Aquí tens un exemple d’anidació:
Això permet gestionar casos en què hi ha múltiples condicions que s’han de complir o no.
En el cas de anidar múltiples “if” en el “else” podem juntarles amb “elif”. Per exemple el codi:
podríem fer-ho més senzill amb “elif”:

Aturar el script: exit

El comando exit finalitza l’execució d’un script i no s’executarà cap codi despres del mateix. Normalment se li pasa un número que indica el resultat del script (exit 0 sol significar que el script ha acabat correctament i exit 1 o qualsevol número major que 0 indica que ha hagut un error).
Això ens permet poder fer comprovacions sense haver de anidar molts if...else if, per exemple:

Estructura condicional “case”

Si volem comparar una variable amb més de 2 valors podem anidar varios if o utilitzar una sentència case que compara una variable amb diversos patrons i executa el codi basat de la coincidència. Per exemple:
Al acabar cada bloc has de posar ;; per a que no continue l’execució del codi del bloc següent. L’ús de *) proporciona una opció per qualsevol entrada que no coincidisca amb cap de les anteriors.

Altres sentències útils

Execució de comandos

Podem executar una comando posant-lo en una línia del nostre script. Per exemple per a obtindre el UID de l’usuari batoi farem:
Però què pasa si vuig guardar el resultat en una variable. El següent codi NO FUNCIONARIA:
Per a executar un comando DINS d’una línia del script (per a guardar el resultat en una variable o per a usar-ho en una condició) hem d’escriure-lo dins de $(...), per exemple:
o també

Resultat de l’últim comando: $?

El valor retornat per l’ultim comando executat (o la última funció cridada) es guarda en la variable especial $?. Si es tracta d’un comando del sistema que retorne 0 significa que s’ha executat correctament i si retorna altre número és que ha hagut un error. Per exemple:

Calcular una expresió

Per a calcular una expressió utilitzem $((...)):

Depurar codi

Per a depurar un script podem posar al principi el comando:
això farà que es mostre cada línia abans d’executar-se.

Arrays

Declarar un Array

assignant valors, per exemple distros[0]='ubuntu'
utilitzant la paraula clau declare, com per exemple decdeclare -a distros=('Ubuntu' 'Linux Mint')
o directament amb distros=('Ubuntu' 'Linux Mint')
Es pot posar text o diferents tipus d’elements.

Accedir als elements

Per a accedir de manera individual a cadascuna de les distros, has d'utilitzar la següent sintaxi, ${distros[i]}. Així per exemple per a imprimir la primera de les distros, utilitzaries tire echo ${distros[0]}.
Ara, si el que fas és echo $distros obtindràs el primer element del array.
Si en lloc d'imprimir una sola distribució en concret, volgueres imprimir-les totes en la mateixa línia, executa echo ${distros[@]}.
Però no sols pots accedir d'un en un al contingut dels elements del teu array. També pots extraure diversos de colp. Per exemple, echo ${distros[@]:1:2}, extraurà la posició 1 i 2 del array.
. La sintaxi utilitzada per als arrays, és exactament la mateixa que per a les cadenes de text. Així, en l'exemple, si executes echo ${distros[0]:2:4} et retornarà les lletres de la 2 a la 4 de la paraula que està en la primera posició de l’array distros.
Per afegir un element al array:
Per reemplaçar un element en un array:
echo ${distros[@]/Linux\ Mint/Debian}
Per coneixer els elements que té un array:
Per eliminar una posició del array:

Concatenanti esborrar arrays

Suposem que es tenen els següents dos arrays:
Per unir dos arrays, s’utilitza el següent mètode:
Per eliminar un array:

Els bucles

Per a fer que un codi s’execute més d’una vegada (per exemple per a cada paràmetre o per a cada element d’un arxiu) tenim els bucles. El bash tenim 3 tipus de bucles: for, while i until:
for s’utilitza per recórrer una llista d’elements i executar una seqüència d’instruccions per a cada element
while s’executa mentre una condició siga certa
until s’executa mentre una condició siga falsa

El bucle “for”

L’estructura de control for es fa servir per recórrer una llista d’elements i executar una sèrie d’instruccions per a cada element de la llista.
La seua sintaxi bàsica és la següent:
On:
variable és una variable que prendrà el valor de cada element de la llista durant cada iteració.
llista és una sèrie d’elements separats per espais que vols recórrer.
Exemple: volem mostrar cada paràmetre pasat (recirda que la llista de paràmetres la tenim en $*)
Exemple: volem recórrer una llista de noms que tenim guardats en una variable i imprimir-los:
Aquest for recorre la llista de noms i imprimeix un missatge per a cada un d’ells.
Podem fer que la llista siga una sequència de números. Per exemple, aquest bucle for escriurà els números de l’1 al 5:
Altra forma de realitzar el mateix d’abans, és:

També pots utilitzar un for per recórrer tots els arxius i subdirectoris d’un directori. Per exemple, aquest for llistarà els arxius d’un directori:
També podem utilitzar for amb una variable contadora que es pot incrementar o disminuir en cada iteració, igual que en la majoria de llenguatges de programació. Per exemple:
Aquest for comença amb i=1, incrementa i en cada iteració i s’atura quan i és major que 5.

El bucle “while”

Aquest bucle continua executant el codi que conté mentre que la seua condició siga certa, per exemple:

El bucle “until”

És igual que el “while” el codi s’executa mentre que la condició siga falsa. Per exemple:
Fixa’t que $((...)) calcula una expressió, com hem vist abans.

Aturar el bucle: break i continue

Dins d’un bucle les comandes continue i break fan que es deixe d’executar el codi:

continue

La comanda continue s’utilitza per saltar l’iteració actual del bucle i passar a la següent iteració.
Quan s’executa continue, qualsevol codi que segueix a continue dins del bucle no s’executarà per aquesta iteració, i el bucle avançarà a l’iteració següent.
És útil quan vols evitar l’execució de determinades comandes dins del bucle en una condició específica, però encara vols continuar amb el bucle.
Exemple:
Aquest bucle imprimirà els números de l’1 al 5, però saltarà la iteració quan numero sigui igual a 3, és a dir, mostrarà els números 1, 2, 4 i 5 i el missatge de “Bucle finalitzat”.

break

La comanda break s’utilitza per sortir immediatament del bucle.
Quan s’executa break, es finalitza el bucle actual i s’executa la comanda següent després del bucle.
És útil quan vols sortir del bucle en una situació particular i no continuar amb les iteracions restants.
Exemple:
Aquest bucle imprimirà els números de l’1 al 2 i, en arribar al 3, sortirà del bucle sense completar les iteracions restants i imprimirà “Bucle finalitzat”.
En resum, continue s’utilitza per saltar a la següent iteració dins del bucle, mentre que break s’utilitza per sortir del bucle.
Recorda que exit sortiria del script (en aquest cas si canviem break por exit imprimirà els números de l’1 al 2 però no imprimirà “Bucle finalitzat”.

Llegir dades d’un fitxer

Moltes vegades hem de fer un script per a treballar amb dades que es troben en fun fitxer de text. La forma més habitual d’accedir a les dades del fitxer és utilitzant un bucle while perquè hem permet llegir cada línia i guardar en una variable diferent cada camp de la línia. La seua sintaxis és:
on IFS indica el caràcter utilitzat en el fitxer per a delimitar els diferents camps dins de cada línia.
Per exemple, tenim el fitxer usuaris.txt amb els noms i contrasenyes d’usuaris que hem de crear:
El script que crearia aquest usuaris podria ser alguna cosa com:

Funcions

Quan el nostre codi és molt gran podem “dividir-ho” en funcions per a que siga més clar. Les funcions són blocs de codi que poden ser cridats i reutilitzades en diferents parts d’un script. Cada funció és com un xicotet script al qual podem cridar dins del nostre script.
saludar és una funció que mostra un salut amb el primer paràmetre que li pasem. La cridem posant el seu nom. La eixida serà:
Les funcions poden retornar un valor amb el comando return:
Fixa’t que la variable especial $? emmagatzemma el resultat de l’ultim comando executat.


Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.