Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Kepa Bengoetxea
Creacin de un Script
Un script es un fichero de comandos.
Entorno y Variables
Las variables en el bash son sin tipo, son una lista de caracteres que permite operaciones aritmticas si todos los caracteres son dgitos.
Ejemplo:
a=1 a=`expr $a + 1` echo "$a a="b" echo `expr $a + 1`
Comandos: echo
Muestra el contenido (variable o texto)
echo $HOME /home/kepa
Caracteres escape:
\c evita el salto de lnea \n inserta un salto de lnea \f inserta un salto de pgina \t inserta un tabulador \v inserta un tabulador vertical \b cdigo de retroceso \r retorno de carro \nnnn genera el cdigo ASCII del nmero octal
Comandos: echo
Caracteres especiales (*, $, \, ?, etc) son interpretados antes de pasarlos a echo, para controlar que tengan efecto o no:
Comillas simples(): impide la interpretacin.
echo '$HOME' -> $HOME
Comandos: read
read: permite la introduccin de valores a travs de un guin.
echo "introduce un directorio" read dir echo "El contenido del directorio es $dir" echo "`ls $dir`"
Esto equivale a:
read -p "introduce un directorio" $dir echo "El contenido del directorio es $dir" echo "`ls $dir`"
Comandos: printf
printf fstring vars: muestra los valores de vars segn el formato especificado en fstring.
$ printf '%s\t :tu carpeta de inicio es %s\n' $USER $HOME kepa :tu carpeta de inicio es /home/kepa $ printf "%s\t :tu carpeta de inicio es %s\n" $USER $HOME kepa :tu carpeta de inicio es /home/kepa
Comandos: $?
$?: valor de la salida del ltimo comando o cdigo de error generado por la ltima orden (0 true y <> 0 false).
$mkdir trabajo(Correcto) $echo $? 0 $mdirk trabajo(Error) $echo $? 1 (valor distinto de 0)
Estructuras de Control:test
Tratamiento de Ficheros: test -c $nomfich #si es un disp. de carcter (keyboard, modem, sound card, etc.) test -p $nomfich #si es una tubera test -h/-L $nomfich #si es un enlace simblico test -S $nomfich #si es un socket test -r $nomfich #si tienes permiso de lectura test -w $nomfich # si tienes permiso de escritura test -x $nomfich # si tienes permiso de ejecucin test -O $nomfich # si eres el propietario
Estructuras de Control:test
Opciones Fichero: Retorna true si... test -G $nomfich #si pertenece al grupo del fichero test -N $nomfich #si ha sido modificado desde la ltima vez que lo leste test $nomfich1 -nt $nomfich2 #Si $nomfich1 es ms reciente que $nomfich2 test $nomfich1 -ot $nomfich2 #Si $nomfich1 es posterior a $nomfich2 test $nomfich1 -ef $nomfich2 #Si $nomfich1 y $nomfich2 son enlaces duros del mismo fichero
Debugging
El shell tambin tiene un modo de depuracin real. Si hay un error en tu script "scriptconerror" entonces puedes depurarlo con: bash -x scriptconerror Esto ejecutar el script y mostrar todas la sentencias que se ejecutan con las variables y comodines ya expandidos.
else
echo "Error al crear el directorio $1"
fi $./copia.sh lana
Comandos: expr
Trabajar con nmeros: expr echo `expr 2 + 200` -> 202
n=`expr 4 + 2`
n=`expr 4 - 2 n=`expr 4 \* 2` #n=8 n=`expr 5 % 2` #n=1 (resto) n=`expr 5 / 2` #n=2 (parte entera) Nota: \ para evitar mezclar con los caracteres especiales: *(cualquier car)
Comandos: expr
Ejm1:
$vi pru
echo "Introduce dos nmeros:" read n1 n2 echo "La suma es `expr $n1 + $n2` "
Comandos: expr
Ejm2:
$vi pru
echo "Introduce dos nmeros:" read n1 n2 echo "La multiplicacin es `expr $n1 \* $n2` "
Operaciones Aritmticas:$(())
$(()):Evala la expresin como operacin entre enteros
n=$(( 4 + 2 ))
n=$(( 4 - 2 )) n=$(( 4 * 2 )) n=$(( 5 % 2 )) n=$(( 5 / 2 )) y=200 #n=8 #n=1 (resto) #n=2 (parte entera)
./pru 1 2 3 4 5 6 7 8 9 10 11 11
./pru 1 2 3 4 5 6 7 8 9 10 11
Entorno y Variables: {}
{}Las llaves son la sntaxis general usada para la sustitucin de variables y $ hace uso de las llaves alrededor del elemento referenciado $1 puede escribirse como $1 ${1} $PATH puede escribirse como ${PATH} Cuando usamos las llaves? Diferencias entre usar: echo "${11} o $11 o ${1}1" echo "$PATH2 o ${PATH}2"
Variables: ${variable:x:y}
${HOME:0:1} El sufijo :0:1 que sigue al nombre de la variable se utiliza para extraer de HOME la subcadena que comienza en la primera posicin (los caracteres se enumerran comenzando desde 0), y contina 1 caracter ms. Es decir, este sufijo se utiliza para conseguir el primer carcter de la variable.
Grupo de comandos:
$ (ls lana;ls dos) > fitx.txt
Trucos
Expansin de llaves:
$ echo {one,two,red,blue}fish onefish twofish redfish bluefish Sustitucin de Comandos: $(command) donde command tiene salida estndar. Se usa para asignar el valor a una variable o para pasar como parmetro a otro comando. Es equivalente a `command`.
$ date +%d-%b-%Y 28-sep-2009 $ today=$(date +%d-%b-%Y) $ echo $today 28-sep-2009 $dpkg-query -L $(dpkg-query -l | grep vim)
Variables: eval
eval cadena :evala la cadena tras la sustitucin de las variables. Convert a string into a command. The eval command can be used for code generation from the command-line or within a script. bash$ command_string="ps ax" bash$ process="ps ax" bash$ eval "$command_string" | grep "$process"
Ejemplo
Qu hace el siguiente programa?
for i in `seq 1 $#` do n=$(echo "\$${i} ${n}") done for j in $(echo "$n") do eval "echo $j" done
Function (parmetros)
$vi prueba.sh function buenosdias() { echo "egunon $1" echo "egunon $2" } read -p Introduce 2 nombres n p buenosdias $n $p
$./prueba.sh
egunon Kepa egunon Joseba
introduce tu nombre
kepa egunon kepa
Function (return)
$vi prueba2.sh function igualabc () {if test $1 = "abc" then return 0 else return 1 fi} echo Introduce un valor read valor igualabc $valor echo $? ./prueba2.sh Introduce un valor
abc
0 $ ./prueba2.sh
Introduce un valor
pepe 1
Function (exit)
$vi prueba2.sh function igualabc () {if test $1 = "abc" then exit 0 else exit 1 fi} echo Introduce un valor read valor igualabc $valor echo $? ./prueba2.sh Introduce un valor
abc
$ ./prueba2.sh Introduce un valor
pepe
1.-$bash ./ejemplo.sh sh ./ejemplo.sh 2.-$./ejemplo.sh 3.-$source ./ejemplo.sh 4.-$. ./ejemplo.sh 5.-$exec ./ejemplo.sh
Source o .
Source se utiliza normalemente en 2 casos: a) Las instrucciones(cambios de path...) y variables afecten al bash padre. .profile PATH="$PATH:$HOME/bin" export PATH b) Si quiero incluir funciones reusables en mi script: $vi funciones: function buenosdias(){echo "egunon $1"} $vi principal.sh: source ./funciones buenosdias $1