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.
Other
● No es el S.O. programs
csh
● Existen múltiples versiones y
podemos averiguar cual Kernel
tenemos instalada haciendo:
% /bin/sh --version bash
X window
Las Shells
En UNIX existen múltiples Shells
– Bourne shell (sh), C shell (csh), Korn shell (ksh), TC shell
(tcsh), Bourne Again shell (bash).
#!/bin/bash
STR="Hola Mundo!" # sin espacios en blanco
echo $STR
– $ ls \*
$ 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
$ x=adios
$ exit
$ echo $x
hola
Variables de Entorno
Hay dos tipos de variables de entorno:
– Variables locales
– Variables del entorno
Las Variables del entorno se establecen por el sistema y se pueden
encontrar utilizando el comando env.
Las variables de entorno contiene valores especiales. Por ejemplo:
$ echo $SHELL
/bin/bash
$ echo $PATH
/usr/X11R6/bin:/usr/local/bin:/bin:/usr/bin
Variables de Entorno
#!/bin/bas #!/bin/bas
h h
COMANDO_1 COMANDO_1
. . . . . .
exit nnn
– ls $( pwd )
– ls $( echo /bin )
Operadores aritméticos
+ suma
- resta
* multiplicación
/ división
** exponenciación
% módulo
Ejemplo
$ a=(5+2)*3
$ echo $a
$ b=2**3
$ echo $a+$b
Evaluación aritmética
La instrucción let se puede utilizar para realizar funciones matemáticas:
– $ let X=10+2*7
$ echo $X
24 No es necesario utilizar $X
$ let Y=X+2*4 para referenciar el valor de X
$ echo $Y
32
Un expresión aritmética se puede evaluar con $[expression] o
$((expression))
– $ echo $((123+20))
143
– $ VALOR=$[123+20]
– $ echo $[123*$VALOR]
1430
– $ echo $[2**3]
– $ echo $[8%3]
Ejemplo (operaciones.sh)
#!/bin/bash
echo -n “Introduzca un primer número: ”; read x
echo -n “Introduzca un segundo número : ”; 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 “Multiplicación: $mul”
echo “División: $div”
echo “Módulo: $mod”
Estructuras de control -
1-condicional
La forma más básica es:
– if [expresión];
then
instrucciones
elif [expresión];
then
instrucciones
else
instrucciones
fi
– Las secciones elif(else if) y else son opcionales
Expresiones
Una expresión puede ser: comparación de cadenas, comparación
numérica, operadores de fichero y operadores lógicos y se representa
mediante [expresión]:
Comparación de cadenas:
– =
– !=
– -n evalúa si la longitud de la cadena es superior a 0
– -z evalúa si la longitud de la cadena es igual a 0
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á vacía, 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
Comparación numérica:
– -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. Cómo está hoy?”
else
echo “Tú no eres $login!!!”
fi
Ejemplo(comparacion1.s)
#!/bin/bash
echo -n “Introduzca un número 1 < x < 10: "
read num
if [ “$num” -lt 10 ]; then
if [ “$num” -gt 1 ]; then
echo “$num*$num=$(($num*$num))”
else
echo “Número fuera de rango !”
fi
else
echo “Número fuera de rango !”
fi
Expresiones
Operadores de archivos:
– -d verifica si el path dado es un directorio
– -f verifica si el path dado es un archivo
– -s verifica si el path dado en un link simbólico
– -e verifica si el fichero existe
– -s verifica si el fichero tiene un tamaño mayor a 0
– -r verifica si el fichero tiene permiso de lectura
– -w verifica si el fichero tiene permiso de escritura
– -x verifica si el fichero tiene permiso de ejecución
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 lógicos:
– ! NOT
– -a AND
– -o OR
Ejemplo(comparacion_logica1.sh)
#!/bin/bash
echo -n “Introduzca un número entre 1 < x < 10:”
read num
if [ “$num” -gt 1 –a “$num” -lt 10 ];
then
echo “$num*$num=$(($num*$num))”
else
echo “Número introducido incorrecto !”
fi
Expresiones
Operadores lógicos:
– && AND
– || OR
Ejemplo(comparacion_logica2.sh)
#!/bin/bash
echo -n “Introduzca un número 1 < x < 10: "
read num
if[ “$number” -gt 1 ] && [ “$number” -lt 10 ];
then
echo “$num*$num=$(($num*$num))”
else
echo “Número introducido incorrecto !”
fi
Parámetros de la shell
Los parámetros posicionales se asignan desde la shell cuando se invoca. Parámetro
posicional “N” se referencia como “${N}”, o “$N” cuando “N” lo forma un sólo dígito
Parámetros especiales
– $# número de parámetros pasados
– $0 devuelve el nombre del shell script que se está ejecutando y su ubicación en
el sistema de archivos
– $* devuelve en una cadena de caracteres todos los parámetros pasados al script
– $@ devuelve un array con los parámetros 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
Instrucción Case
case $var in
val1)
instrucciones;;
val2)
instrucciones;;
*)
instrucciones;;
esac
Ejemplo
Ejemplo(case.sh)
#!/bin/bash
echo -n “Introduzca un número 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 “Número 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
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
Ejemplo(for7.sh)
#!/bin/bash
read –p “Introduzca el nombre de un directorio: ”
directorio
echo “enlaces simbólicos en el directorio
$directorio “
for fichero in $( find $directorio -type l )
do
echo "$fichero"
done
Arrays con bucles
Crear un array
mascota[0]=perro
mascota[1]=gato
mascota[2]=pez
pet=( perro gato pez )
Longitud máxima de un array son 1024 elementos.
Para extraer una entrada del array ${array[i]}
$ echo ${mascota[0]}
perro
$ echo ${mascota[2]}
pez
Arrays
Para extraer todos los elementos se utiliza un
asterisco:
echo ${array[*]}
Para saber cuántos 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 número: ”; 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 números es: $sum”
Estructura while
while expresion_evalua_a_true
do
instrucciones
done
• Ejemplo(while.sh)
#!/bin/bash
echo –n “Introduzca un número: ”; 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 números es: $sum”
Estructura until
until [expression_evalua_a_true]
do
instrucciones
done
• Ejemplo(until.sh)
#!/bin/bash
echo “Introduzca un número: ”; 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
}