Shell Scripting

Shell scripting: automatitza tasques i guanya eficiència al terminal



El shell scripting, és a dir, escriure scripts per al shell, és una eina molt potent dels sistemes Unix i Linux: et permet automatitzar tasques, guanyar eficiència i treure tot el suc a la línia de comandes. Un script de shell és una seqüència de comandes escrites en el llenguatge d’un shell, com ara Bash, que l’intèrpret executa una darrere l’altra.

Què és un script de shell?

Un script de shell és, simplement, un fitxer de text que conté una seqüència de comandes que s’executen per ordre. Pot ser tan senzill com unes quantes comandes que escriuries a mà al terminal, o tan complex com un programa complet amb variables, condicions, bucles i funcions. Serveix sobretot per automatitzar tasques repetitives i per assegurar-te que unes comandes s’executen sempre en el mateix ordre i de la mateixa manera.

Avantatges del shell scripting

Automatitzar tasques

Els scripts et permeten automatitzar feines rutinàries com copiar fitxers, gestionar processos o tractar dades, de manera que no les hagis de fer a mà cada vegada.

Administrar el sistema amb més eficiència

Una tasca que demana deu comandes es converteix en una de sola. Guanyes temps i, sobretot, redueixes els errors humans: l’script no s’oblida cap pas ni s’equivoca de nom de fitxer.

Encadenar comandes amb lògica

Pots executar comandes en seqüència i, també, només si es compleix una condició (per exemple, si l’anterior ha anat bé). És la base per crear fluxos de treball ordenats i previsibles.

Personalitzar l’entorn

Amb scripts pots configurar variables d’entorn, crear àlies i preparar l’entorn de treball tal com t’agrada.

Principis bàsics

El shebang

Els scripts comencen amb un shebang: els caràcters #! seguits de la ruta de l’intèrpret que l’ha d’executar. Per exemple, #!/bin/bash indica que l’script s’ha d’executar amb Bash. Una variant molt habitual és #!/usr/bin/env bash, que busca bash al PATH i fa l’script més portable entre sistemes.

Variables

Les variables guarden informació per fer-la servir més endavant. Es defineixen sense espais al voltant del signe = i se’n llegeix el valor posant-hi $ al davant:

nom="Joan"
echo "Hola, $nom"

Posa sempre les variables entre cometes dobles ("$nom"): així no es trenquen si el valor conté espais.

Dins d’un script, $1, $2… són els arguments que li passes en executar-lo, i $? és el codi de sortida de l’última comanda (0 vol dir que ha anat bé).

Comentaris

Els comentaris comencen amb # i el shell els ignora. Serveixen per explicar què fa cada part de l’script, cosa que agrairàs quan el tornis a obrir d’aquí a uns mesos.

Estructures de control

Els scripts admeten condicions (if, elif, else, case) i bucles (for, while, until), que permeten executar comandes segons una condició o de manera repetida:

for servidor in web1 web2 db1; do
    echo "Comprovant $servidor..."
done

comptador=1
while [[ $comptador -le 3 ]]; do
    echo "Volta $comptador"
    comptador=$((comptador + 1))
done
Comprovant web1...
Comprovant web2...
Comprovant db1...
Volta 1
Volta 2
Volta 3

Funcions

Les funcions permeten dividir el codi en peces i reutilitzar-les. Es defineixen amb el nom seguit de parèntesis, nom() { …; }, o amb la paraula clau function (function nom { …; }). La primera forma és la més portable.

Un script bàsic de mostra

Aquest és l’exemple clàssic: un script que saluda l’usuari.

#!/usr/bin/env bash
# Script de salutació

echo "Hola, benvingut al món del shell scripting!"

Desa’l com a salutacio.sh, dona-li permís d’execució i executa’l:

$ chmod +x salutacio.sh
$ ./salutacio.sh
Hola, benvingut al món del shell scripting!

La comanda echo només imprimeix el missatge a la pantalla. També el pots executar sense permís d’execució amb bash salutacio.sh.

Un exemple més útil

Aquest script comprimeix els fitxers .log d’un directori que tinguin més d’uns quants dies. Fa servir arguments amb valor per defecte, una condició, una funció i un bucle:

#!/usr/bin/env bash
# Comprimeix els fitxers .log d'un directori que tinguin més de N dies
set -euo pipefail

directori="${1:-.}"     # primer argument; si no n'hi ha, el directori actual
dies="${2:-7}"          # segon argument; per defecte, 7 dies

if [[ ! -d "$directori" ]]; then
    echo "Error: $directori no és un directori" >&2
    exit 1
fi

comprimir() {
    gzip -- "$1"
    echo "Comprimit: $1"
}

total=0
while IFS= read -r -d '' fitxer; do
    comprimir "$fitxer"
    total=$((total + 1))
done < <(find "$directori" -maxdepth 1 -type f -name '*.log' -mtime +"$dies" -print0)

echo "Fitxers comprimits: $total"
$ ./neteja.sh logs 7
Comprimit: logs/error.log
Comprimit: logs/app.log
Fitxers comprimits: 2

$ ./neteja.sh noexisteix
Error: noexisteix no és un directori
$ echo $?
1

Algunes coses a destacar:

  • set -euo pipefail atura l’script al primer error, si fas servir una variable no definida o si falla qualsevol comanda d’una canonada. És un bon hàbit per a qualsevol script.
  • ${1:-.} vol dir «el primer argument o, si no n’hi ha, .».
  • Els missatges d’error van a la sortida d’errors (>&2) i l’script acaba amb exit 1, perquè qui el cridi sàpiga que ha fallat.
  • find … -print0 amb read -d '' funciona encara que els noms de fitxer tinguin espais.

Bones pràctiques

  • Prova abans en un directori de proves, sobretot si l’script esborra o mou fitxers.
  • Comprova la sintaxi sense executar-lo amb bash -n script.sh, i fes-hi passar ShellCheck (paquet shellcheck), que detecta errors habituals com variables sense cometes.
  • Programa’l: per executar un script cada dia o cada hora, fes servir cron o un temporitzador (timer) de systemd.
  • Si creix massa, potser ja no toca Bash: per a lògica complexa o tractament de dades, un llenguatge com Python serà més fàcil de mantenir.

Conclusió

El shell scripting és una habilitat molt valuosa per a qualsevol usuari de Linux i Unix. Automatitzar tasques, guanyar eficiència i personalitzar l’entorn són només alguns dels avantatges. A mesura que en dominis els principis bàsics i avançats, podràs crear scripts potents que et simplificaran la feina diària a la línia de comandes.

Posts relacionats