M06 UF2: Automatització de tasques i llenguatges de guió |
ASIX-2
|
GNU/Linux
|
Arxius de guió dels bash de Linux
(Part 1)
|
18/03/21
|
Scripts
a enviar per alumne: Aquí
Data Límit: 28-3-2020 a les 23.59.59
Publicació de solucions: 29-3-2021
Correu: cf@collados.org
Assumpte: asix2_cognom_nom_m06uf2pr2
Missatge: URL de Github d'un dipòsit de nom asix2_cognom_nom_m06uf2pr2
DOCUMENTACIÓ
0- Referències
1- http://www.tldp.org/LDP/abs/html/index.html
2- http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
3- http://linuxconfig.org/bash-scripting-tutorial
4- https://www.shellscript.sh/
1- El "shebang"
El shebang en linux correspon a el conjunt de caràcter #! el quals són utlitzats pel sistema per saber que el fitxer és un script (arxiu de guió) i que a continuació s'indica quin és l'interpret utilitzat per executar el script. El shebang s'ha d'escriure sempre al principi de qualsevol script. Així doncs, pel cas de scripts que han de ser executats per bash (interpret d'ordres de Debian, Ubuntu, Red Hat....) qualsevol arxiu de guió hauria de començar per:
#! /bin/bash2- Definició de
variables del shell
a) Són variables definides per l'usuari des del shell de
Linux, i que poden ser utilitzades en qualsevol moment per
desarr dades. Una variable no és res més que una paraula (cadena
de caràcters) a la qual assignem un valor que podria ser un
nombre, nom de directori, nom de fitxer, nom de dipositiu, un
caràcter, una cadena de caràcters i qualsevol altre tipus de
dada.
b) Una variable ha de definir-se abans de poder ser
utilitzada, donant-li un nom i indicant a que és igual. El nom
d'una variable ha de complir les següents normes:
*Ha de incloure lletres o nombres o _
*No pot començar amb un nombre
*No admet els caracters &, ! i
espai en blanc
*No pot tenir més d'una paraula.
c) Una variable es defineix així:
nom_variable=valor_variable
d) Exemples:
cadena=hola
dada=5
nom="Joan Pérez"
e) Per cridar al contingut d'una variable s'ha posar al
davant el signe $. Si ara escrivim echo $nom,
veurem per pantalla la paraula hola.Si fem que
dirusr=/home/usuari, llavors cd $dirusr ens
portarà al directori /home/usuari.
3- Varables de sistema i delimitadors de cadenes.
Alguns caracters són especials, poden ser problemàtics i cal
delimitar-los. Els caracters especials amb els quals podem tenir
problemes i cal delimitar són els següents: ? * . [] & $
i l'espai en blanc. Els 2 delimitadors més importants són
les cometes i l'apòstrof.
a) Delimitació de caracters amb cometes.
Poden delimitar tots els caracters especials, menys $.Exemple:
name=Pere
nom="Hola, soc $name"
echo $nom
Per pantalla sortirà => Hola, soc Pere
b) Delimitació de caracters amb apòstrof
Delimiten tots els caracters, inclòs $. Exemple:
name=Pere
nom='Hola, soc en $name'
echo $nom
Per pantalla sortirà => Hola, soc en $name
4- echo
Escriu a continuació la
cadena de caràcters que li passem com a paràmetre i fa el canvi
de línia. Especialment útil per treballar amb fitxers de guió.
Les " i ' són caràcters delimitadors que s'utilitzen normalment
amb echo.
Exemples:
echo Hola --->
retorna Hola
echo "Hola món" ---> retorna Hola món
nom_usuari=Pere
echo "Hola $nom_usuari" ---> retorna Hola
Pere
echo 'Hola $nom_usuari' ---> retorna
Hola $nom_usuari
a) Amb l'ordre read,
tot allò que s'introdueixi des de teclat serà assignat a una
variable. És equivalent a fer un scanf del llenguatge C.
b) Si volem tractar els
caràcters especials com per exemple $, *, ? / [ \ ] ( ) <
> >>, com a caràcters normals , llavors els hem de
delimitar amb cometes o apotrof.
c) Per demanar a
l'usuari dades per teclat es pot fer això:
echo -n "Dona opció:"
read opcio
d) Si volem utilitzar l'ordre read
per introduir una contrasenya, hem d'utilitzar l'opció -s
de l'ordre. Per exemple:
a) Amb bash podem fer
les operacions aritmètiques + - / * **
++ -- < > <=
>= != ==. Quan es fan comparacions
el valor serà 0 si és veritat i 1 si és fals.
b) El resultat d'una comparació s'ha de buscar dins de la variable $?.
c) És molt important
delimitar les operacions dins de $(( )).
Exemple 1 |
Exemple 2 |
Exemple 3 |
Exemple 4 |
Exemple 5 |
a) Amb bash podem fer
les següents comparacions de cadenes > <
<= >= != ==.
b) Quan es fan
comparacions el valor de $? serà 0 si és
veritat i 1 si és fals.
c) Les comparacions in ordre
alfabètic segons el codi ASCII.
d) Es delimiten les comparacion
dins de [[ ]]
e) Dins de [[ ]] cada
variable necessita el $ al davant per indicar que volem
treballar amb el seu contingut.
f) Ha d'haver espais en blanc
obligatoris entre [[ i la primera variable.
g) Ha d'haver espais en
blanc obligatoris entre ]] i la segona variable.
h) Millor un espai en blanc
entre les variables i el comparador.
i) El resultat de la comparació
s'ha de buscat dins de la variable $?.
Exemples:
a=hola b=adeu [[
$a == $b ]] echo $? 1 (és
mentida) |
a=hola b=adeu [[
$a < $b ]] echo $? 1 (és mentida) |
a=hola b=adeu [[ $a
> $b ]] echo $? 0 (és veritat) |
a=hola b=adeu [[ $a
== $b ]] echo $? 1 (és mentida) |
a=hola b=adeu [[ $a
!= $b ] echo $? 0 (és
veritat) |
a=hola b=hoa [ $a
!= $c ] echo $? 1 (és mentida) |
a) Té moltes opcions.
Millor anar a el manual amb man test. Una de les opcions
més important és -e que
ens permet saber si un fitxer existeix o no.
Exemple: [[ -e nom_fitxer
]]
Si existeix el fitxer, l'ordre
ens retorna 0 dins de la variable $?, i un 1
si no existeix. Dins del nom del fitxer s'ha d'incloure el
directori a on es troba.
b) Una altra opcio important és -s que retorna un 0 dins de la variable $? si un fitxer existeix i té una mida diferent a zero bytes.
c) Amb l'opció -d, ens diu si existeix o
no un director. Ens diu que és 0 (veritat) si
existeix el directori. Compte, que si
existeix però no és un directori retorna fals, igual que si no
existeix.
Exemple: [[ -d
nom_directori ]]
d) [[ !
-e nom_fitxer ]] retorna 0 si és
veritat que el fitxer no existeix, i retorna 1
(mentida) si el fitxer existeix.
e) [[ ! -d nom_fitxer ]] retorna 0 si és veritat que el directori no existeix, i retorna 1 (mentida) si el directori existeix.
NOTA: Els espais en
blanc són importants!!!
12- Operacions AND, OR i
NOT amb números
a) Operació lògica AND
--> &&
b) Operació lògica OR
--> ||
c) Operació lògica NOT --> !
Exemple:
a=5 b=3 c=6 (( b < a )) && (( c > a )) echo $? 0 (és veritat) |
a=5 b=6 c=4 (( b < a )) ||
(( c > a )) echo $? 1 (és mentida)
|
a=7 b=6 !(( b < a )) echo $? 1 (és mentida) |
NOTA: Els espais en blanc no són importants però val la pena manternir-los!!!
9- Operacions AND, OR i NOT amb cadenes
a) Operació lògica AND
--> &&
b) Operació lògica OR
--> ||
c) Operació lògica NOT --> !
Exemple:
a=jordi b=carles c=francisco [[ $a
> $b ]] && [[
$b < $c ]] echo $? 0 (és veritat) |
a=carles b= jordi c=francisco [[ $a > $b ]] || [[ $b < $c ]] echo $? 1 (és mentida) |
a=carles b=jordi ! [[
$b < $a ]] echo $? 1 (és mentida) |
NOTA: Els
espais en blanc són importants!!!!!!!!!!!!!!!
10- Ordre if-then-else-fi
Comprova si una ordre ha estat executada amb èxit o si una
expressió és correcta. En cas de que el resultat de la
comprovació sigui veritat, executa una sèrie d'ordres, i si és
falsa, n'executa unes altres. Funciona bàsicament igual que
if-else de C. L'ordre then és
equivalent a { i l'ordre fi
a }. També permet avaluar l'èxit o
fracàs de l'execució d'una ordre del bash shell.
Estructura:
if ordre_o_expressió_linux
then
ordre_linux_1
ordre_linux_2
ordre_linux_3
....................
else
ordre_linux_N
ordre_linux_N+1
....................
fi
Exemple 1:
Fes un arxiu de guió que ens permeti fer un llistat del
directori en el qual es troba l'usuari, amb dues opcions: a)
Veure mida dels fitxers b) Veure totes les característiques
dels fitxers.
#!/bin/bash
echo "Escriu s per llistar el directori amb la mida dels
arxius"
echo "Escriu l per llistar totes les característiques dels
arxius"
read opc
if [[ $opc == "s" ]]
then
ls -s
else
ls -l
fi
exit 0
Exemple 2:
Fes un arxiu de guió que ens permeti comprova si un fitxer
existeix o no.
#!/bin/bash
echo "Escriu el nom del fitxer: "
read nom
if [[ -e $nom ]]
then
echo "El fitxer $nom existeix"
else
echo "El fitxer $nom no existeix"
fi
exit
0
Exemple 3:
Fes un arxiu de guió que ens permeti fer un llistat del
directori en el qual es troba l'usuari, amb dues opcions: a)
Veure mida dels fitxers b) Veure totes les característiques
dels fitxers.
#!/bin/bash
echo
"Escriu s per llistar el directori amb la mida dels arxius"
echo "Escriu l per llistar totes les característiques dels
arxius"
read opc
if [[ $opc == "s" ]]
then
ls -s
else
ls -l
fi
exit
0
Exemple 4:
Fes un arxiu de guió que mostri el missatge "Valor negatiu"
si un nombre donat per l'suari és menor a 0 i que mostri el
missatge "Valor positiu" si el valor donat és més gran o igual
a 0
#!/bin/bash
echo "Escriu la quatitat:"
read num
if (( num >= 0 ))
then
echo "El valor és positiu"
else
echo "El valor
és negatiu"
fi
exit
0
Estructura:
case valor_comparat
in
valor_de_comparació_1)
ordre
ordre;;
valor_de_comparació_2) ordre
ordre
ordre;;
valor_de_comparació_3) ordre;;
..........................................
..........................................
*) ordre_per_defecte
ordre_per_defecte;;
esac
Exemple 1:
#!/bin/bash
echo " a) Llistat del directori /home/pere"
echo " b) Llistat del directori /home/joan"
echo " c) Llistat del directori /home/anna"
echo " d) Llistat del directori /home/maria"
read opc
case $opc in
a) ls -ls /home/pere;;
b) ls -ls /home/joan;;
c) ls -ls /home/anna;;
d) ls -ls /home/maria;;
*) echo "Opció incorrecta";;
esac
exit 0
Exemple 2:
#!/bin/bash
case
"$1" in
'start')
/usr/app/startup-script
;;
'stop')
/usr/app/shutdown-script
;;
'restart')
echo "Usage: $0 [start|stop]"
;;
esac
exit 0
Exemple 3:
#!/bin/bash
a=7
case
"$a" in
[0-4]) echo
"No aprovat";;
[5-6]) echo "Aprovat";;
[7-8]) echo "Notable";;
9|10) echo "Excel·lent";;
esac
exit 0
12- Ordre while-do-done
* Executa ordres_linux
mentre es compleixi ordre_o_expressió_linux.
Sempre acaba amb done.
Abans d'entrar en el llaç s'avalua la condició d'entrada.
* Potser no
s'executen mai les instruccions dins del bucle
* Estructura:
while ordre_o_expressió_linux
do
ordres_linux
done
Exemple 1
#!/bin/bash
a=1
while (( a <= 4 ))
do
b=$(( a * 2 ))
echo $b
a=$(( ++a ))
done
echo "Adéu i fins una altra ocasió"
exit
0
El resultat serà:
2
4
6
8
Adéu i fins una altra ocasió
Exemple 2
#!/bin/bash
opc=s
while [[ $opc != n ]]
do
clear
echo -n "valor 1: "
read v1
echo -n "valor 2: "
read v2
suma=$(( v1 + v2 ))
echo -n "La suma de $v1 + $v2 és: $suma"
echo
echo -n "Vols continuar (s/n): "
read opc
done
exit 0
13- Ordre until-do-done
* Executa
ordres_linux mentre es compleixi ordre_o_expressió_linux.
Sempre acaba amb done.
Abans d'entrar en el llaç s'avalua la condició d'entrada.
*
S'executen com a mínim una vegada les instruccions dins del
bucle
Exemple 1:
#!/bin/bash
a=8
until (( $a <= 4 ))
do
b=$(( a * 2 ))
echo $b
a=$(( --a ))
done
echo "Adéu i fins una altra ocasió"
exit
0
Estructura:
for variable in llista
do
ordres_linux
done
Funciona de la següent manera:
1r)
Assigna a variable al primer valor de llista
2n)
Executa ordres_linux
3r)
Assigna variable al següent valor de la llista
4t)
Executa ordres_linux
5è) Torna
al 3r pas fins que s'acabin les variables de la llista.
Exemple 1:
|
Exemple 2:
|
Exemple 3 for a in 1 2 3 4 do b=$(( a * 2 )) echo $b done El resultat serà: |
Exemple 4
El resultat serà: |
Exemple 5
El resultat serà:
|
Exemple 6
El resultat serà: Nota: Només
farà 1, 5 i
9.
|
#!/bin/sh
logfile="/var/log/messages"
for
mon in Sun Mon Tue Wed Thu Fri Sat
do
grep $mon $logfile
> $logfile.$mon
done
exit 0
El resultat serà un fitxer de log diferent per cada dia de la setmana, a partir del fitxer de log general /var/log/messages
19- Ordre exit
exit n: Finalitza
l'execució de l'arxiu de guió del bash shell, i assigna el valor
n com a codi de retorn (que normalment serà un zero si tot ha
anat bé, i diferent de zero en cas contrari).
2- Mira la nota (4). Desenvolupa
un script per l'usuari root
que faci la configuració bàsica d'un servidor DHCP. El programa
ha de fer les següents tasques:
6-
Mira la nota
(7). Fes
un arxiu de guió de l'interpret d'ordres
del bash shell que: