Diferència entre revisions de la pàgina «Bash script»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
Línia 163: Línia 163:
  
 
== Exercicis ==
 
== Exercicis ==
 +
Exercicis de scripts:
 
# Crea un script que agafi tots els arxius .JPG indicats al directori que li passem com a argument, i els canvii d'extensió a .PNG
 
# Crea un script que agafi tots els arxius .JPG indicats al directori que li passem com a argument, i els canvii d'extensió a .PNG
 
# Investiga la llibreria [http://www.imagemagick.org ImageMagick] i utilitza la comanda '''''convert''''' per transformar les imatges de la carpeta que passem al script a una resolució fixa de 800x600 pixels.
 
# Investiga la llibreria [http://www.imagemagick.org ImageMagick] i utilitza la comanda '''''convert''''' per transformar les imatges de la carpeta que passem al script a una resolució fixa de 800x600 pixels.
# Fes el joc del penjat en BASH.
+
# Fes el joc del penjat en Bash.
# Millora el joc del penjat afegint un diccionari de paraules en un arxiu de text, fent que el programa trii una de les paraules aleatòriament.
+
# Millora el joc del penjat afegint un diccionari de paraules en un arxiu de text (una paraula per línia), fent que el programa trii una de les paraules aleatòriament.
 +
# ...
 +
 
 +
Exercicis de backups:
 +
# Crea un ''script'' per comprimir els continguts de la carpeta que es passa com a argument. Ha de demanar interactivament si utilitza compressió gzip o bz2.
 +
 
 +
Exercicis de configuració de serveis:
 +
# Crea un ''script'' que configuri un '''servidor Samba PDC'''. Ha de generar l'arxiu de configuració '''smb.conf''' d'acord amb les indicacions de l'article de [[Samba]]. De forma interactiva, l'''script'' ha de demanar les dades necessàries: nom del domini, nom NetBIOS, si es publiquen el profiles separats dels homes, o junts, etc.
 +
# Crea un ''script'' que configuri una màquina Linux Ubuntu LTS (en principi 14.04) i la fiqui en un domini Samba d'acord amb el què s'explica a l'article.
 +
# Fes un ''script'' que configuri una màquina Linux amb la següent configuració:
 +
#* Una doble xarxa (a) NAT i (b) interna amb 192.168.33.1
 +
#* El servei DNSMASQ per fer de DNS
 +
#* El servidor DHCP del DNSMASQ per servir IPs en les
 
# ...
 
# ...
# Crea un script que configuri un '''servidor Samba PDC'''. Ha de generar l'arxiu de configuració '''smb.conf''' d'acord amb les indicacions de l'article de [[Samba]]. De forma interactiva, l'''script'' ha de demanar les dades necessàries: nom del domini, nom NetBIOS, si es publiquen el profiles separats dels homes, o junts, etc.
 
#
 
  
 
<br>
 
<br>

Revisió del 14:01, 16 feb 2016

Intro

Els diversos Unix's han tingut sempre una potent interfície de comandes. La shell és la interfície que ens permet "dialogar" amb el nucli del sistema operatiu passant-li comandes.

Hi ha diversos llenguatges de shell script, entre ells el CSH (C-shell), i el KSH (Korn-shell), però sembla que el què s'ha imposat definitivament és el BASH o Bourne-Again SHell.

És important dominar algun dels editors de text per consola. El més típic ara és el nano, tot i que convé també conèixer vi ja que sol tenir syntax highlight (vim o vi improved) i perquè per raons històriques sempre està present i ens pot treure d'un apuro.

Referències:


Arxius i permisos

Els scripts son arxius de text amb instruccions llegibles per la nostra shell. Es comenten amb un # tot i que la 1a línia és una excepció (comença per #!) i indica quin serà l'intèrpret que l'executarà. Edita hola.sh des del teu editor de text favorit:

#!/bin/bash
# això és un comentari
echo "hola!"  # això ja és una instrucció

...i abans de començar a executar-lo cal donar permisos d'execució a l'arxiu:

$ chmod +x hola.sh

...i ara sí que ja el podem executar:

$ ./hola.sh


Entorn

Les comandes de la shell s'executen sense incloure tota la ruta mercès a la variable d'entorn $PATH

$ echo $PATH

...i podrem veure els directoris (separats per :) en els que la shell buscarà una comanda quan la teclegem. Les que (quasi) segur que hi han de ser son:

/bin:/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

En aquestes carpetes hi ha les comandes més habituals que utilitzem com ls a /bin o ifconfig a /sbin (a sbin hi ha les de Superusuari, d'aquí la 's' al davant).

Si algun dia volem saber on hi ha una comanda que estem utilitzant, podem esbrinar-ho amb:

$ which ls

...i ens dirà on està el binari que s'executarà amb aquesta comanda (que es buscarà als diferents directoris $PATH, en l'ordre que estan situats).


Directori ~/bin

Un truc força útil és crear la carpeta bin al nostre home directory. Aquesta es posarà automàticament al $PATH (fes logout i login després de crear la carpeta). Aquest és el lloc on posar scripts nostres i que no calgui que estiguin disponibles per altres usuaris.

$ mkdir ~/bin

...fes logout i login i comprova el $PATH


Variables

Les variables porten un $ al davant (similar a Perl i PHP), com p.ex. $PATH. En qualsevol moment i des de la pròpia shell (sense crear un script) podem crear-ne:

$ aaa=22
$ sss='els strings millor entre cometes per evitar errors amb els espais'
$ echo $aaa
22

OJU!: és important que el signe "=" estigui enganxat, és a dir sense espais, al nom de la variable i al valor.

Recordem que podem veure totes les variables d'entorn amb:

$ env

Busca la nostra variable 'aaa' a la llista, veuràs que no hi és. Si ho vols fer com els pros, filtra la sortida amb grep:

$ env | grep aaa

Si volem que les nostres variables estiguin disponibles per altres programes, aplicacions, scripts, etc. caldrà exportar-les:

$ export aaa=22

Si ara filtrem la llista de variables d'entorn, veurem que sí que hi és:

$ env | grep aaa


Expressions aritmètiques

Per efectuar càlculs matemàtics ens caldrà utilitzar la següent sintaxi:

$((expressió))

Per exemple:

$ echo $((11+5))
16

OJU: en principi només ens permet aritmètica sencera (integers). No podem utilitzar nombres en coma flotant (floats). Si volem efectuar operacions matemàtiques en coma flotant haurem d'utilitzar l'aplicació bc (Basic Calculator). Feu-li un cop d'ull aquí a la utilització de bc.

Si algun dels elements no és un element interpretable es prendrà com un zero '0' (per exemple, variables no definides o strings no transformables a integer).


Arguments

Dintre d'un script podem accedir als arguments que ens passi l'usuari amb les variables $1, $2, etc.

Per exemple, podem crear un script args.sh com aquest:

echo El primer argument és $1
echo El segon és $2
echo el nom del script és $0

I l'executem amb:

$ ./args.sh hola que tal


Bucles, llistes i altres gaites

És important recalcar que els bucles (loops) de bash script solen estar basats en llistes, enlloc de índexs. Com que habitualment els programadors ens posem nerviosos amb aquest canvi, us poso també com fer un bucle basat en índex (perquè quedi constància, ja que a la pràctica no es fa servir gaire ;)

Bucle indexat

Típicament:

for a in {5..10}
do
    echo $a
done

Es poden posar bucles inversos {10..5} i també amb salts {10..5..2}.

També es pot fer a l'estil C:

for (( i=0; i<10; i++ ))
do
    echo $a
done

Bucle de llista (a.k.a. "for each")

Aquest és el realment útil. Hi ha moltes maneres de fer-los, però solen seguir aquesta forma:

for elem in elements
do
    ...
done

El típic exemple és un llistat d'arxius d'alguna carpeta, per exemple, /var. En aquest cas posem els noms d'arxius a la variable $arxius (tal i com ho solem fer amb la comanda ls) i després podrem iterar pels seus elements:

arxius=/var/*.jpg  # triem només els arxius .jpg (no n'hi ha cap, però)
arxius=/var/l*     # triem només els arxius que comencen per "l"
for elem in $arxius
do
    echo arxiu = $elem
done

while...do i do...while

Segur que també coneixeu aquest.


Condicionals

...

if...then

...

switch...case

...


stdin, stdout i redireccions a arxius

...


pipes

...


Exercicis

Exercicis de scripts:

  1. Crea un script que agafi tots els arxius .JPG indicats al directori que li passem com a argument, i els canvii d'extensió a .PNG
  2. Investiga la llibreria ImageMagick i utilitza la comanda convert per transformar les imatges de la carpeta que passem al script a una resolució fixa de 800x600 pixels.
  3. Fes el joc del penjat en Bash.
  4. Millora el joc del penjat afegint un diccionari de paraules en un arxiu de text (una paraula per línia), fent que el programa trii una de les paraules aleatòriament.
  5. ...

Exercicis de backups:

  1. Crea un script per comprimir els continguts de la carpeta que es passa com a argument. Ha de demanar interactivament si utilitza compressió gzip o bz2.

Exercicis de configuració de serveis:

  1. Crea un script que configuri un servidor Samba PDC. Ha de generar l'arxiu de configuració smb.conf d'acord amb les indicacions de l'article de Samba. De forma interactiva, l'script ha de demanar les dades necessàries: nom del domini, nom NetBIOS, si es publiquen el profiles separats dels homes, o junts, etc.
  2. Crea un script que configuri una màquina Linux Ubuntu LTS (en principi 14.04) i la fiqui en un domini Samba d'acord amb el què s'explica a l'article.
  3. Fes un script que configuri una màquina Linux amb la següent configuració:
    • Una doble xarxa (a) NAT i (b) interna amb 192.168.33.1
    • El servei DNSMASQ per fer de DNS
    • El servidor DHCP del DNSMASQ per servir IPs en les
  4. ...