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: