La shell Bash ens permet crear programes útils per realitzar tasques repetitives a nivell de sistema operatiu; automatitzar còpies de seguretat, esquemes de directoris, cerques de patrons complexes, gestionar usuaris i els seus permisos ...

Què són els scripts dels SO?

Els intèrprets d’ordres o shells són programes que permeten la interacció dels usuaris amb el S.O. i el seu hardware. També incorporen llenguatges de programació per a crear programari que anomenem scripts (en català, guions).

Els scripts de shell són molt útils per fer tasques de gestió i administració del sistema (com monitoritzar les tasques en execució) i altres treballs repetitius que no requereixen un llenguatge de programació més sofisticat (per exemple, còpies de seguretat)

Intèrprets d'ordres a Windows

Command Prompt (cmd.exe): Aquest és l'intèrpret d'ordres clàssic de Windows. Equivalent i compatible al COMMAND.COM d'MS-DOS i versions de Windows de 16 i 32 bits. Té dos modes d'execució:

  • Interactiu: l’usuari escriu les ordres per ser executades
  • Mode per lots (batch): executa una sentència predefinida d’ordres guardada en un .bat

Windows PowerShell: interfície de consola per a S.O. Windows llançada el 2006, incorporat des de Windows 7, que té com a utilitat principal l’automatització de tasques administratives més avançades. Té una sintaxi més moderna, basada en la programació orientada a objectes.

Els 2 intèrprets coexisteixen i s'utilitzen per propòsits diferents.

Intèrprets d'ordres a Linux

El shell Bash (Bourne-Again Shell) és l’intèrpret d’ordres predeterminat de gairebé totes les distribucions GNU/Linux, així com de Mac OS X, i pot executar-se en la majoria dels sistemes operatius tipus Unix.

Se'n poden instal·lar d'altres a Linux, com Zsh que incorpora algunes funcionalitats més avançades i més personalització.

Intèrprets d'ordres a Mac

Tant macOS (originalment OS X) com Linux tenen les seves arrels en Unix, un sistema operatiu desenvolupat als anys 70 amb llicència BSD () i àmpliament utilitzat per implantar sistemes operatius multiusuari els anys 80. Aquesta herència comuna ha fet que molts components i idees siguin compartides entre ambdós sistemes operatius, incloent-hi els shells.

Quan Apple va llançar OS X (ara macOS) el 2001, es va basar en un nucli Unix BSD i va triar Bash (Bourne Again Shell) com a shell predeterminat per la seva popularitat i compatibilitat amb scripts existents.

Un dels dubtes més freqüents quan s'estudien les llicències dels SO és com pot ser que Mac i Linux, que tenen un enfocament totalment oposat respecte les llibertats del usuaris, poden compartir els mateixos intèrprets d'ordres, part del programari i la arquitectura.

Apple va poder utilitzar components del sistema operatiu BSD (Berkeley Software Distribution), una variant d'Unix desenvolupada a la Universitat de Califòrnia, Berkeley. BSD té una llicència més permissiva que la GPL (General Public License) de Linux, que permet l'ús i la distribució de codi modificat amb menys restriccions. És a dir, que permet llicenciar el programari derivat amb una llicència propietària d'Apple.

Com executar un script a Linux ?

Abans de començar a entendre la sintaxi del llenguatge d'scripts de Bash. El que farem és crear un nou script, a partir d'un fitxer amb instruccions, li donarem els permisos per a que sigui executable i finalment l'executarem.

Per a crear el teu script amb la shell de Linux obre el terminal (cerca el programa que té una pantalla negre com a icona , o usa la drecera Ctrl+Alt+T)

  1. Crea el fitxer hacking.sh amb un editor com nano o gedit, amb extensió sh.
#!/bin/bash
for i in {1..100}
do
 echo "Hacking. $i% completed."
 sleep 2
done
echo "Hacking completed :)"
  1. Converteix-lo a programa, assignant permisos d'execució.
chmod u+x hacking.sh
ls -l
  1. Executa i a gaudir :)
./hacking.sh

Resultat esperat: Cada 2 segons sortirà el mateix missatge, a excepció del número % completed, que gràcies al bucle s'anirà incrementant.

Hacking. 1% completed.
Hacking. 2% completed.
Hacking. 3% completed.

Una alternativa als passos 2 i 3, si no ets un usuari amb permisos d'administrador (no estàs al grup sudo), és aquesta:

sh hacking.sh

Variables locals i variables d'entorn

Al shell, una variable és un nom que representa un valor que volem guardar pel seu posterior ús en un o més punts dels nostres programes.

Poden ser:

  • Locals: només són visibles pel shell en el qual estem treballant, no són visibles per cap shell fill.

Per a declarar variables és important recordar que:

  • Les variables d'entorn no poden tindre espais, i si volem assignar un valor amb espai hem de "entrecomillar", o bé precedir l'espai per un caràcter d’escapament.
  • Per mostrar la variable mitjançant la funció echo l'hem de precedir amb el símbol de dòlar $.
NOM='Katy Perry'
echo $NOM

Katy Perry

NOM=Katy\ Perry
echo $NOM

Katy Perry

Per a eliminar una variable d'entorn podem usar la comanda unset.

Per exemple:

unset $NOM
echo $NOM

D’aquesta manera podrem fer inteccacions com les següents:

variable1='Sabates negres'
variable2=20.5
echo "L’article $variable1 costa $variable2 euros"

L’article Sabates negres costa 20.5 euros

  • D'entorn: són visibles tant pel shell pare com pels shells fills. Per defecte disposem de variables d'entorn predefinides que ens poden resultar útils per a la programació d'scripts.
export NOM_VAR = valor

Hi ha diverses ordres relacionades amb les variables:

Ordre set Permet veure totes les variables (locals i d’entorn) definides en una sessió.

Ordre env Permet veure les variables d’entorn definides en una sessió.

Exemples típics:

  • USER: Nom de l'usuari actiu
  • HOME: Directori de l'usuari (per defecte /home/USER )
  • PWD: Directori on es troba l'usuari
  • PATH: Llista de directoris on cercar programes abans de buscar-los al disc. Permet executar un programa sense dir-li la ruta sencera.

Si volem veure el valor d'una variable en concret; la instrucció és igual que si fos una de local.

echo $PWD

/home/mamoros/Documents/m01-a02

Si volem guardar totes les variables d'entorn en un fitxer usem l'operador de redirecció >:

echo env > vars_ent.txt 

Caràcters especials.

Hi ha caràcters que per a la shell tenen un significat especial. Existeixen diferents tècniques per tal que la shell ignori aquest significat o el tingui en compte:

**** anul·la el significat especial del caràcter que va darrera

‘’  anul·la el significat especial de tots els caràcters que estiguin dins les cometes

“”  anul·la el significat especial de tots els caràcters excepte: $ \ `` “”

Exemple: echo “Això és \”una prova\”” Exemple: echo “Sóc el/la $LOGNAME i estic a $PWD: $PWD”

Tractament de la data del sistema.

Saber la data i hora del sistema en funció de la nostra zona horària és molt important per a certes tasques: monitoritzar la activitat d'un ordinador servidor, posar nom i data de les còpies de seguretat...

Per mostrar la data del sistema en format llarg ho podem fer cridant la funció del sistema date; fixa't que per a què es mostri el resultat de la funció l'hem de rodejar entre parèntesis i un símbol de dòlar: $(date)

echo “La data del sistema és: $(date)

Si volem un format més curt i propi de la nostra zona (que es mostri en format dd/mm/aaaa i la hora per separat) ho podem fer assignant el format que volem com a paràmetre.

data=$(date +%d/%m/%Y)
hora=$(date +%H:%M:%S)
echo "Data en format ddmmaaaa: $data"
echo "Hora en format hh:mm:ss: $hora"

Data en format ddmmaaaa: 06/08/2024 Hora en format hh:mm:ss: 22:40:33

En ocasions el sistema no detectarà automàticament el nostre fus horari (això passa en màquines virtuals sobretot) i si és el cas el podrem consultar i editar:

timedatectl
sudo timedatectl set-timezone Europe/Madrid

[https://learning.lpi.org/es/learning-materials/102-500/108/108.1/](Certificació Linux LPI 102, zones horàries)

Exercici. Crea un script que crei una carpeta dins del directori actual (on et trobes) amb el nom projecte-<data_avui>-<hora_avui> i al final informi de la seva creació correcta. Recorda que pots usar instruccions com mkdir i cd.

Observació Per ara no farem el tractament de què fer si existeix una carpeta igual (ja el farem un cop vists els condicionals)

data=$(date +%d/%m/%Y)
hora=$(date +%H:%M)
carpeta="projecte-${data}-${hora}"
mkdir $carpeta
echo "Carpeta del projecte $carpeta creada correctament"

Carpeta del projecte projecte-06/08/2024-22:48 creada correctament


Pas de paràmetres i funcions.

Un script és un fitxer que conté comandos Bash executables. Els fitxers ocults de configuració de Bash com .bash_profile o .bashrc, vistos en la part de la gestió d’usuari són exemples de scripts.

Principalment Bash utilitza variables de tipus cadena de caràcters. Això li diferencia d'altres llenguatges de programació on les variables poden tenir diferents tipus predefinits. Encara que aquest és el tipus per defecte de les variables de Bash, més endavant veurem que les variables en Bash també poden tindre altres tipus, com per exemple números amb els quals realitzar operacions aritmètiques; tal i com passa amb els llenguatges de tipat dinàmic com Python o Javascript.

Per conveni les variables d'entorn exportades (les que passem als subprocesos) s'escriuen en majúscules, i les que no exportem en minúscules.

Aquesta regla, més que per la manera interactiva, és especialment seguida pels scripts i funcions que començarem a programar ara.

Els paràmetres posicionals són els encarregats de rebre els arguments d'un script i els paràmetres d'una funció.

Els seus noms són 1, 2, 3, etc., amb el que per a accedir a ells utilitzarem, com normalment, el símbol $ de la forma $1, $2, $3, etc.

A més tenim el paràmetre posicional 0 ($0) que emmagatzema el nom del script on s'executa.

#!/bin/bash
#Exemple de script que rep paràmetres y les imprimeix
echo "El script $0"
echo "Rep els arguments $1 $2 $3 $4"

Si ho hem guardat en un fitxer anomenat rep amb el permís d'execució activat podem executar-lo així:

chmod u+x rep
./rep hola adios

El script ./rep Rep els arguments hola adios

Codis de terminació.

En UNIX les comandes acaben retornant un codi numèric al qual es diu codi de terminació (exit estatus) que indica si el comando va tindre èxit o no.

Encara que no és obligatori que siga així, normalment un codi de terminació 0 significa que el comando va acabar correctament, i un codi entre 1 i 255 correspon a possibles codis d'error.

Per a llegir el codi de terminació de l'últim comando executat disposem de la variable ?, el valor del qual és $?.

Per exemple:

$ cd direrroneo
-bash: cd: direrroneo: No such file or directory
$ echo $?

1

La variable ? ha de ser llegida junt després d'executar la comandes, doncs és molt típic guardar el seu valor en una variable ct=$? per al seu posterior ús.


TODO:

[https://docs.google.com/document/d/1LdS5s57BuTZWhO4P3HJY0Jj1Gb78lmjI/edit#heading=h.361zrmbsmhzt](M01 - Scripts amb Linux)


## lectura i escriptura de fitxers (cat)

## read --> obtenció respostes usuari.

## Condicions: if, elif, else

## Bucles

## Lectura / escriptura de fitxers

## Exercicis