IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Creació de fitxers

La forma més fàcil de crear un fitxer buit és:

$ touch fitxer

O simplement editar-lo directament (i salvar després de l'edició)

$ vi fitxer

$ nano fitxer
$ joe fitxer
$ gedit fitxer

Tenim altres alternatives:

$ :> fitxer
$ cat /dev/null > fitxer
NOTA: Les anteriors comandes buiden un fitxer dels seus continguts (no així touch)

Execució d'scripts

Per tal de poder executar un script cal que sigui executable:

$ sudo chmod +x fitxer.sh

O es pot executar directament amb:

$ sh fitxer

o

$ bash fitxer

Cal tenir en compte també el valor del PATH:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Que normalment (per raons de seguretat) no inclou el .. Aleshores per executar un script cal:

$ ./fitxer.sh

Observeu que només podreu utilitzar el tabulador, si el fitxer és executable.

Introduir valors i comparar-los

Exemple de càlcul del major valor entre dos paràmetres:

#!/bin/bash

echo "Introduir dos números:" 

read A

read B 

if [ $A -gt $B ]
 then
  echo "$A és major que $B"
 else
  echo "$B és major que $A"
fi

Pas de paràmetres

$ cat parametres.sh
#!/bin/bash
clear
echo "Paràmetres: $#"
echo "Número paràmetres: $*"
echo "Nom de l'script: $0" 

j=1
for i in $*
 do
  echo "Paràmetre $j:$i"
  j=$(($j + 1))
done

Pas de paràmetres i comparar-los

#!/bin/bash
echo $#
if [ $# -ne 2 ]
 then
   echo "Falta algun paràmetre"
 elif [ $1 -eq $2 ]
  then
    echo "$1 i $2 són iguals"
  elif [ $1 -lt $2 ]
   then
     echo "$1 és menor"
   else
     echo "$2 és menor"
fi

Calculador bàsica

#!/bin/bash

echo "Introduir els números a operar:" 

read A

read B

echo "Indiqueu quina operació voleu realitzar:"

echo "Suma [s]"

echo "Resta [r]"

echo "Multiplicació[m]"

echo "Divisió[d]"

read OP

if [ $OP = s ]
 then
  RESUL=`expr $A + $B`
 elif [ $OP = r ]
  then
   RESUL=`expr $A - $B`
  elif [ $OP = m ]
   then
    RESUL=`expr $A \* $B`
   else
    RESUL=`expr $A / $B`
fi
echo "Resultat:$RESUL"

Crear un menú d'opcions

#!/bin/bash

echo "Menú:"

echo "[1] Alta usuari"
echo "[2] Baixa usuari"
echo "[3] Modificació usuari"

echo "Elegiu una opció"

read OP
  
case $OP in
   
  1) clear
     ./altausuari.sh
  2) clear
     ./baixausuari.sh
  3) clear
     ./modificaciousuari.sh

Control de flux

Bucle while

$ while [ 1 ]; do echo "foo" ; sleep 1s ; done


Iterar els fitxers d'una carpeta

Hi han múltiples formes:

$ for i in `ls`; do echo "$i"; done 

Un altre:

for f in ./*; do [ -f "$f" ] && echo "$f"; done 

Iterar tots els paràmetres d'un script

for var in "$@"
do
    echo "$var"
done

Operacions aritmètiques (Arithmetic evaluation)

Per fer una suma no podem fer:

$ echo 1 + 1

Cal fer:

echo $((1+1)) 

Comparacions

Consulteu l'ordre test:

$ man test

Valors enters

  • -eq: igual (equal)
  • -ne: no igual (not equal)
  • -lt: menys que (less than)
  • -le: menys que o igual (less than or equal)
  • -gt: més gran que (greater than)
  • -ge: més gran que o igual (greater than or equal)

Operadors de text

      -n STRING
             the length of STRING is nonzero
      STRING equivalent to -n STRING
      -z STRING
             the length of STRING is zero
      STRING1 = STRING2
             the strings are equal
      STRING1 != STRING2
             the strings are not equal

Altres comparacions

  • -z: L'string és null (té longitud 0)
String=   # Zero-length ("null") string variable.

   if [ -z "$String" ]
   then
     echo "\$String is null."
   else
     echo "\$String is NOT null."
   fi     # $String is null.


  • -n: Només si l'string és no nul


Compte! no fer el següent

if [ -n $String ]

Cal posar les cometes!!

if [ -n "$String" ]

Operacions

Crear un comptador

j=1
for i in $*
 do
  echo "$j"
 j=$(($j + 1))
 done

expr

Avalua expressions

Vegeu l'exemple: Calculador bàsica

let

Enviar un missatge a tots les terminals on esta logat un usuari

$ cat missatge.sh
#!/bin/bash 

if [ $# -ne 2 ]
 then
  echo "Utilitza: $0 usuari missatge"
  exit
fi 

who | grep $1 | awk '{print $2}' | while read tty
 do
  write $1 $tty << end
  $2
end

Exemple:

$ sudo ./missatge.sh sergi HOLA!

Enviar un missatge a tothom i a totes les terminals on estan logats

$ cat missatgeTots.sh
#!/bin/bash 
 
if [ $# -ne 1 ]
 then
  echo "Utilitza: $0 missatge"
  exit
fi 
          
who | awk '{print $1}'|uniq | while read usuari
 do
  ./missatge.sh $usuari $1 
 done

Exemple:

$ sudo ./missatgeTots.sh HOLA!

Recursos: http://www.ibm.com/developerworks/library/l-bash-test.html

Afegir una línia a un fitxer (p.ex. sources.list) només si no existeix

echo "[some repository]" | sudo tee -a /etc/apt/sources.list

Per exemple:

echo "deb http://download.virtualbox.org/virtualbox/debian jaunty non-free" | sudo tee -a /etc/apt/sources.list

El problema és que si ja existeix la línia tindrem línies repetides i donarà un error al fer update.

Un exemple complet:

#!/bin/bash
#Obtenir la versió d'Ubuntu
ubuntu_release=`lsb_release -c | awk '{ print $2}'`
#Comprovar si ja existeix la línia a sources.list
virtualbox_in_sources=`cat /etc/apt/sources.list | grep "deb http://download.virtualbox.org/virtualbox/debian $ubuntu_release non-free"`

#Només afegim la línia si no existeix
if [ -z "$virtualbox_in_sources" ]; then
  sudo cp /etc/apt/sources.list /etc/apt/sources.list.orig.virtualbox
  echo "deb http://download.virtualbox.org/virtualbox/debian jaunty non-free" | sudo tee -a /etc/apt/sources.list
fi

#Instal·lar la clau de virtual box
sudo apt-get install wget
wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | sudo apt-key add -
# Actualitzar apt                                                                  
sudo apt-get update
sudo apt-get install virtualbox-2.2

Incloure en un script la informació de la versió i distibució Debian

# /etc/-release is like:
# DISTRIB_ID=Ubuntu
# DISTRIB_RELEASE=6.06
# DISTRIB_CODENAME=dapper
# DISTRIB_DESCRIPTION="Ubuntu 6.06 LTS"
[ -e /etc/lsb-release ] && . /etc/lsb-release

Recursos:

Iterar un fitxer línia a línia

Es pot utilitzar canviat en IFS (Internal Field Separator):

#!/bin/bash
 
IFS=$'\n'
for line in $(cat filename); do
  echo $line
done

O es pot utilitzar un while

#!/bin/bash

cat filename | while read line; do
  echo $line
done

Comprovar un usuari (per exemple comprovar que s'executa un script com a root)

currentuser=`whoami`;
if [ "$currentuser" != "root" ]
then
	echo "Warning!!!!!!!!"
	echo " This script isn't running as root!";
	echo "Warning!!!!!!!!" 
	sleep 5;
fi

TroubleShooting

[: ==: s'esperava un operador unari (unary operator expected)

Per exemple el següent script:

number=2
if ["$number" == "1" ]; then
    echo  "TRUE";
else
    echo  "FALSE";
fi

el problema està a la línia:

 if ["$number" == "1" ]; then

Ha d'haver-hi un espai:

 if [ "$number" == "1" ]; then

Vegeu també