Scripts de Shell en Linux
Scripts de Shell en Linux
Que es el Shell?
Es la interfaz entre el usuario
final y el Sistema Operativo.
No es el S.O.
csh
Other
programs
Kernel
bash
X window
Las Shells
En UNIX existen mltiples Shells
Bourne shell (sh), C shell (csh), Korn shell (ksh), TC shell
(tcsh), Bourne Again shell (bash).
Programacin o scripting?
bash no es nicamente una excelente shell por lnea de comandos
Programacin o scripting?
Un lenguaje de scripting tambin comienza por el cdigo
fuente, pero no se compila en un ejecutable
En su lugar, un intrprete lee las intrucciones del fichero
fuente y las ejecuta secuecialmente
Los programas interpretados son, en general, ms lentos que
los compilados
La principal ventaja reside en que el fichero de cdigo fuente
es fcilmente portable a cualquier sistema operativo
Variables
Como en cualquier lenguaje de programacin, en shell
scripting se pueden utilizar variables
Todos los valores son almacenados como cadenas de
texto
Tambin hay operadores matemticos que convierten
las variables en nmeros para el clculo
No es necesario declarar una variable, simplemente
asignndole un valor a su referencia ser suficiente
para crearla
Variables
Ejemplo
#!/bin/bash
STR="Hola Mundo!" # sin espacios en blanco
echo $STR
Atencin !
El lenguaje de programacin de la shell no hace un
casting de los tipos de las variables
Esto signifca que una misma variable puede contener
datos numricos o de texto
contador=0
contador=Domingo
Atencin !
El caracter de escape de la bash es \ y
preserva el valor literal del siguiente caracter
al que acompaa:
$ ls \*
ls: *: No such file or directory
Comando export
El comando export pone una variable en el entorno de forma que
sea accesible por los procesos hijos. Por ejemplo:
$ x=hola
$ bash
# Ejecuta una shell en proceso hijo
$ echo $x
# Nada en x
$ exit
# Volvemos al proceso padre
$ export x
$ bash
$ echo $x
hola
# Ah est.
Comando export
Si el proceso hijo modifica el valor de la variable x, no
modificar el valor original del proceso padre. Verificarlo
cambiando el valor de x de la siguiente manera:
$ x=adios
$ exit
$ echo $x
hola
Variables de Entorno
Hay dos tipos de variables de entorno:
Variables locales
Variables del entorno
Variables de Entorno
Las variables del entorno se definen en /etc/profile,
/etc/profile.d/ y ~/.bash_profile.
Estos ficheros son de inicializacin y son ledos cuando
se invoca la bash shell.
Cuando la login shell sale, la bash lee ~/.bash_logout
Variables de Entorno
HOME: argumento por defecto (directorio home) del comando cd.
PATH: el path de bsqueda de comandos. Es una lista de
directorios separados por : en los que se buscar cuando se teclea
cualquier comando
Normalmente, introducimos los comandos de la siguiente manera:
$ ./trash.sh
Variables de Entorno
LOGNAME: contiene el nombre de usuario
HOSTNAME: contiene el nombre de la mquina
MACHTYPE: sistema hardware
PS1: secuencia de caracteres monstrados antes del prompt
\t hora
\d fecha
\w directorio actual
\W ltima parte del directorio actual
\u nombre de usuario
\$ caracter del prompt
UID: contiene el id del usuario que no puede ser modificado
SHLVL: contiene el nivel de anidamiento de la shell
Variables Intrnsecas
Comando exit
El comando exit se puede utilizar para finalizar la ejecucin de
un script o para devolver una valor, el cul estar disponible al
proceso padre del script.
Cuand un script termina con exit sin parmetros, el estado de
salida ser el del ltimo comando ejecutado en el script
#!/bin/bash
#!/bin/bash
COMANDO_1
COMANDO_1
. . .
. . .
exit
exit $?
Comando exit
Cuando se ejecuta el script con el comando
exit con parmetros, la sintaxis es:
exit nnn
Donde nnn=0-255 y el estado de salida es nnn
Comando Read
El comando read nos permite solicitar un valor de
entrada para almacenarlo en una variable
Ejemplo (leer.sh)
#!/bin/bash
echo -n Introduzca nombre de fichero a borrar:
read fichero
rm -i $fichero
echo Fichero $fichero borrado!"
Comando Read
Opciones
read s
(no hace echo de la entrda)
read nN
(acepta slo N caracteres de entrada)
read p mensaje (muestra un mensaje)
read tT
(acepta una entrada por un tiempo
mximo de T segundos)
Ejemplo
$ read s n1 -p si (S) o no (N)? respuesta
si (S) o no (N) ? S
$ echo $respuesta
S
Sustitucin de comandos
El smbolo ` tiene un uso diferente de . Se utiliza para sustitucin de
instrucciones. Es decir si dentro de un script aparece el texto `comando`
entonces se ejecutar lo orden que est entre las `
$ LISTA=`ls`
$ echo $LISTA # Lista los archivos
hola.sh leer.sh
$(comando)
Operadores aritmticos
+
*
/
**
%
suma
resta
multiplicacin
divisin
exponenciacin
mdulo
Ejemplo
$
$
$
$
a=(5+2)*3
echo $a
b=2**3
echo $a+$b
Evaluacin aritmtica
La instruccin let se puede utilizar para realizar funciones matemticas:
$ let X=10+2*7
$ echo $X
24
$ let Y=X+2*4
$ echo $Y
32
No es necesario utilizar $X
para referenciar el valor
de X
Evaluacin aritmtica
Ejemplo (operaciones.sh)
#!/bin/bash
echo -n Introduzca un primer nmero: ; read x
echo -n Introduzca un segundo nmero : ; read y
suma=$(($x + $y))
resta=$(($x - $y))
mul=$(($x * $y))
div=$(($x / $y))
mod=$(($x % $y))
# imprimimos las respuestas:
echo Suma: $suma
echo Resta: $resta
echo Multiplicacin: $mul
echo Divisin: $div
echo Mdulo: $mod
Expresiones
Una expresin puede ser: comparacin de cadenas, comparacin
numrica, operadores de fichero y operadores lgicos y se representa
mediante [expresin]:
Comparacin de cadenas:
=
!=
-n
-z
Ejemplos:
[ s1 = s2 ]
(true si s1 es igual a s2, sino false)
[ s1 != s2 ]
(true si s1 no es igual a s2, sino false)
[ s1 ]
(true si s1 no est vaca, sino false)
[ -n s1 ]
(true si s1 tiene longitud mayor que 0, sino false)
[ -z s2 ]
(true si s2 tiene longitud 0, sino false)
Expresiones
Comparacin numrica:
-eq
-ge
-le
-ne
-gt
-lt
Ejemplos:
[ n1 -eq n2 ]
[ n1 -ge n2 ]
[ n1 -le n2 ]
[ n1 -ne n2 ]
[ n1 -gt n2 ]
[ n1 -lt n2 ]
Ejemplo(comparacion0.s)
#!/bin/bash
echo -n Introduzca su nombre de usuario: "
read login
if [ $login = $USER ]; then
echo Hola, $login. Cmo est hoy?
else
echo T no eres $login!!!
fi
Ejemplo(comparacion1.s)
#!/bin/bash
echo -n Introduzca un nmero 1 < x < 10: "
read num
if [ $num -lt 10 ];
then
if [ $num -gt 1 ]; then
echo $num*$num=$(($num*$num))
else
echo Nmero fuera de rango !
fi
else
echo Nmero fuera de rango !
fi
Expresiones
Operadores de archivos:
-d
-f
-s
-e
-s
-r
-w
-x
Ejemplos:
[ -d nombre_fichero]
[ -f nombre_fichero ]
[ -e nombre_fichero ]
[ -s nombre_fichero ]
[ -r nombre_fichero ]
[ -w nombre_fichero ]
[ -x nombre_fichero ]
Ejemplo
Ejemplo(comparacion_archivos.s)
#!/bin/bash
if [ -f /etc/fstab ];
then
cp /etc/fstab .
echo Hecho.
else
echo Archivo /etc/fstab no existe.
exit 1
fi
Expresiones
Operadores lgicos:
!
-a
-o
NOT
AND
OR
Ejemplo(comparacion_logica1.sh)
#!/bin/bash
echo -n Introduzca un nmero entre 1 < x < 10:
read num
if [ $num -gt 1 a $num -lt 10 ];
then
echo $num*$num=$(($num*$num))
else
echo Nmero introducido incorrecto !
fi
Expresiones
Operadores lgicos:
&&
||
AND
OR
Ejemplo(comparacion_logica2.sh)
#!/bin/bash
echo -n Introduzca un nmero 1 < x < 10: "
read num
if[ $number -gt 1 ] && [ $number -lt 10 ];
then
echo $num*$num=$(($num*$num))
else
echo Nmero introducido incorrecto !
fi
Parmetros de la shell
Los parmetros posicionales se asignan desde la shell cuando se invoca. Parmetro
posicional N se referencia como ${N}, o $N cuando N lo forma un slo dgito
Parmetros especiales
$# nmero de parmetros pasados
$0 devuelve el nombre del shell script que se est ejecutando y su ubicacin en el
sistema de archivos
$* devuelve en una cadena de caracteres todos los parmetros pasados al script
$@ devuelve un array con los parmetros pasados al script
Ejemplo(parametros.sh)
#!/bin/bash
echo $#; $0; $1; $2; $*; $@
$ parametros.sh estudiante1 estudiante2
2; ./parametros.sh; estudiante1; estudiante2; estudiante1
estudiante2; estudiante1 estudiante2
Instruccin Case
case $var in
val1)
instrucciones;;
val2)
instrucciones;;
*)
instrucciones;;
esac
Ejemplo
Ejemplo(case.sh)
#!/bin/bash
echo -n Introduzca un nmero entre 1 < x < 10:
read x
case $x in
1) echo Valor de x es 1.;;
2) echo Valor de x es 2.;;
3) echo Valor de x es 3.;;
4) echo Valor de x es 4.;;
5) echo Valor de x es 5.;;
6) echo Valor de x es 6.;;
7) echo Valor de x es 7.;;
8) echo Valor de x es 8.;;
9) echo Valor de x es 9.;;
0 | 10) echo Nmero incorrecto.;;
*) echo Valor no reconocido.;;
esac
Estructura for
for
for var in lista
do
statements
done
Ejemplo(for1.sh)
#!/bin/bash
let sum=0
for num in 1 2 3 4 5
do
let sum = $sum + $num
done
echo $sum
Estructura for
Ejemplo(for2.sh)
#!/bin/bash
for x in papel lapiz boli; do
echo El valor de la variable x es: $x
sleep 1
done
Ejemplo(for3.sh)
#!/bin/bash
for x in papel A4 lapiz STADTLER boli BIC; do
echo El valor de la variable x es: $x
sleep 1
done
Ejemplo(for4.sh)
#!/bin/bash
lista=antonio luis maria pepa
for x in $lista
do
echo El valor de la variable x es: $x
sleep 1
done
Estructura for
Ejemplo(for5.sh)
#!/bin/bash
# Lista todos los ficheros del directorio actual
for x in *
do
ls -l $x
sleep 1
done
Ejemplo(for6.sh)
#!/bin/bash
# Lista todos los ficheros del directorio /bin
for x in /bin
do
ls -l $x
done
Estructura for
Ejemplo(for7.sh)
#!/bin/bash
read p Introduzca el nombre de un directorio:
directorio
echo enlaces simblicos en el directorio
$directorio
for fichero in $( find $directorio -type l )
do
echo "$fichero"
done
Arrays
Para extraer todos los elementos se utiliza un
asterisco:
echo ${array[*]}
Para saber cuntos elementos hay en el array:
echo ${#array[*]}
Podemos combinar los arrays con bucles utilizando
for:
for x in ${array[*]}
do
echo ${array[$x]}
done
Bucle tipo C
Estructura tipo C alternativa para for
for (( EXPR1 ; EXPR2 ; EXPR3 ))
do
instrucciones
done
Ejemplo(for8.sh)
#!/bin/bash
echo Introduzca un nmero: ; read x
let sum=0
for (( i=1 ; $i<$x ; i=$i+1 )) ; do
let sum = $sum + $i
done
echo La suma de los primeros $x nmeros es: $sum
Estructura while
while expresion_evalua_a_true
do
instrucciones
done
Ejemplo(while.sh)
#!/bin/bash
echo n Introduzca un nmero: ; read x
let sum=0; let i=1
while [ $i le $x ]; do
let sum = $sum + $i
let i = $i + 1
done
echo La suma de los primeros $x nmeros es: $sum
Estructura until
until [expression_evalua_a_true]
do
instrucciones
done
Ejemplo(until.sh)
#!/bin/bash
echo Introduzca un nmero: ; read x
echo ;
until [ $x -le 0 ]; do
echo $x
x=$(($x 1))
sleep 1
done
echo ; echo FIN
Funciones
Ejemplo(func1.sh)
#!/bin/bash
function check() {
if [ -e "/home/$1" ]
then
return 0
else
return 1
fi
}
echo Introduzca el nombre del archivo: ; read x
if check $x
then
echo $x existe !
else
echo $x no existe !
fi
Depuracin
Bash ofrece dos formas de depurar los shell scripts
-v : muestra cada lnea completa del script antes de ser ejecutada
-x : muestra cada lnea abreviada del script antes de ser ejecutada