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)
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.
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
$ 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
#!/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
#!/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"
#!/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
$ while [ 1 ]; do echo "foo" ; sleep 1s ; done
Hi han múltiples formes:
$ for i in `ls`; do echo "$i"; done
Un altre:
for f in ./*; do [ -f "$f" ] && echo "$f"; done
for var in "[email protected]" do echo "$var" done
Per fer una suma no podem fer:
$ echo 1 + 1
Cal fer:
echo $((1+1))
Consulteu l'ordre test:
$ man test
-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
String= # Zero-length ("null") string variable. if [ -z "$String" ] then echo "\$String is null." else echo "\$String is NOT null." fi # $String is null.
Compte! no fer el següent
if [ -n $String ]
Cal posar les cometes!!
if [ -n "$String" ]
j=1 for i in $* do echo "$j" j=$(($j + 1)) done
Avalua expressions
Vegeu l'exemple: Calculador bàsica
$ 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!
$ 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
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
# /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:
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
currentuser=`whoami`; if [ "$currentuser" != "root" ] then echo "Warning!!!!!!!!" echo " This script isn't running as root!"; echo "Warning!!!!!!!!" sleep 5; fi
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