Bash. Apunts
Última modificació: abril 2015
Redirectors
Tenim 3 redirectors: stdin, stdout i stderr.
stdout i stderr:
- L'1 representa stdout (la sortida per defecte)
- El 2 representa stderr (sortida d'error)
-Sortida de programa a fitxer:
ls > ls.txt
-Sortida només de stderr a fitxer:
grep da * 2> error.txt
-Sortida stdout a un fitxer i stderr a un altre:
grep da * > resultat.txt 2> error.txt
-Sortida de stdout al mateix descriptor de fitxer que stderr:
grep da * 1>&2
-Sortida de stderr i stdout al mateix fitxer:
grep da * > resultat_i_errors.txt 2>&1
-stdout i stderr que no ens diguin res:
ls -w1 >/dev/null 2>&1
En aquest cas enviem al dispositiu /dev/null. Això ens serveix per no enviar la sortida a cap lloc, molt útil per silenciar crons que s'executen molt sovint i poden omplir el els logs de "soroll".
stdin:
El treballarem amb pipes.
-Busquem a menu.txt la paraula hola:
cat menu.txt | grep hola
-Busquem als logs mencions a USB i ho guardem a un fitxer:
cat /var/log/syslog | grep USB > dispositius.txt
Ens trobem que hi han instruccions que no accepten que se'ls passin coses amb pipes. Per a aquests casos tenim xargs, que el que fa es agafar el que li arriba del pipe i l'enganxa al final de la instrucció que te a la dreta. Exemple:
-Esborrar tots els fitxers .tmp amb xargs i rm (que no accepta pipes):
find / -name "*.tmp" | xargs rm -rf
Variables
No existeixen tipus, es poden emmagatzemar números i strings a les variables i no fa falta declarar-les, tot i que pot ser útil declarar una variable com local a una funció (veure més endavant a funcions).
Exemple:
STR="Hello world!"
echo $STR
Hem de ficar el $ davant de la variable, per a que ens doni el valor que conté.
Tenim aquest cas:
echo $(ls)
en aquest cas ens tornarà la llista de fitxers que genera el comandament ls. Es pot escriure també entre cometes invertides:
echo `ls`
Un altre exemple interessant sobre el mateix:
echo "`cat file.txt`"
I encara un altre, fer un backup del meu home amb la data d'avui al nom de fitxer .tgz resultant:
OF=$(date +%Y%m%d).tgz
tar -cvzf $OF /home/elmeuhome
Arguments passats en cridar a un script
Si tenim un script anomenat script.sh que conté:
echo "El teu nom és: $1 i tens $2 anys"
I el cridem amb:
./script.sh "Jan" "9"
Obtindrem el resultat:
El teu nom és: Jan i tens 9 anys
Condicionals
La sintaxi és:
if [expressió]
then
echo "ok"
else
echo "no"
fi
L'expresió pot ser més o menys complexa. Alguns exemples:
Comprovar si existeix el fitxer /tmp/hola.txt
if [ -e /tmp/hola.txt]
Comprovar si existeix el directory /tmp/user
if [ -d /tmp/user ]
Loops
-For. Es diferent a altres llenguatges. Bàsicament, va iterant sobre una sèrie de paraules contingudes a una cadena. Exemple:
for i in $( ls ); do
echo item: $i
done
Podem tamber aconseguir un for semblant al de C/perl:
for i in `seq 1 5`;
do
echo $i
done
El mateix "for" de l'exemple anterior escrit d'altres maneres:
for i in 1 2 3 4 5
for i in $(seq 1 5)
-While. Executa un codi mentre l'expressió a avaluar sigui true.
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
-Until. Executa mentre l'expressió sigui false.
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
Funcions
A les funcions pot ser interessant declarar variables locals amb "local".
Un exemple de funció:
# Definim la funció hello
function hello {
local HELLO=World
echo $HELLO
}
# Definim la variable HELLO
HELLO=Hello
# Mostra'm la variable HELLO, el resultat serà que ens mostrarà "Hello"
echo $HELLO
# Crida a la funció hello, el resultat serà que ens mostrarà "World", ja que
# ens monstra el contingut de la variable local a la funció anomenada "HELLO"
hello
# Mostra'm la variable HELLO, el resultat serà que ens mostrarà "Hello"
echo $HELLO
----------------
Lectura necessària: