Unidad 12 - Programación Shell
description
Transcript of Unidad 12 - Programación Shell
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 1
UNIDAD 12 – PROGRAMACIÓN SHELL
El shell es un intérprete de comandos que permite al administrador ejecutar determinadas tareas. Pero
el shell no es únicamente eso, ya que los intérpretes de comandos son un auténtico lenguaje de
programación que le permite al administrador automatizar y programar tareas. Como cualquier lenguaje de
programación, el shell de GNU/Linux incorpora sentencias de control, de asignación, funciones, etc.
Los programas de shell no necesitan ser compilados, como ocurre en otros lenguajes, y son ejecutados
línea a línea, por lo que a estos programas se les conoce también con el nombre de shell script.
1. CONCEPTOS BÁSICOS
VARIABLES
Se utilizan para poder guardar información y a partir de ella tomar decisiones o realizar operaciones.
No pueden tener el nombre de ninguna palabra reservada (p. ej. : echo, if, while, do…)
Operaciones:
Asignarles un valor.
a. Valor numérico:
num=5
b. Cadena de caracteres (comillas dobles):
nombre=”Juan”
c. Resultado de la ejecución de un comando (acentos graves):
com=`ls –l`
Mostrar su contenido (símbolo $)
echo $num
echo $nombre
echo $com
PASO DE PARÁMETROS
Los scripts pueden recibir parámetros desde la línea de comandos. Los parámetros se pueden usar dentro
del script como cualquier otra variable de shell.
Variables:
Nombre del programa: $0
Primer parámetro $1, segundo parámetro $2, tercer parámetro $3, etc…
Todos los parámetros: $* ó $@
Número total de parámetros: $#
Ejemplo:
#!/bin/bash
echo “El nombre del programa es” $0
echo “El primer parámetro recibido” es $1
echo “El segundo parámetro recibido” es $2
echo “El número total de parámetros” es $#
echo “Todos los parámetros recibidos” son $*
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 2
2. ENTRADA Y SALIDA DE DATOS
E/S POR CONSOLA
Salida de datos: comando echo.
Entrada de datos:
Asignando directamente un valor mediante =. Ej: num=5
Con el paso de parámetros $0, $1, $2…
Comando read
Ejemplo comando read:
echo "Introduce tu nombre "
read nombre
echo $nombre
El comando read también permite leer varias variables a la vez:
echo "Introduce tu nombre y apellidos "
read nombre apellidos
echo $nombre
echo $apellidos
Otro ejemplo:
#!/bin/bash
echo –n “Introduce un valor: ” #con –n evitamos el salto de línea
read valor
echo “El valor introducido es: ” $valor
Ejercicio: escribir un guión que pregunte tu nombre, apellidos y edad y los muestre por pantalla.
REDIRECCIÓN DE LA E/S
Cuando se ejecuta un programa en Linux se abre automáticamente tres archivos de E/S para ellos:
la entrada estándar (stdin), por defecto: la pantalla.
la salida estándar (stdout), por defecto: el teclado.
el error estándar (stderr), por defecto: la pantalla.
Es posible reasignar estos destinos antes de ejecutar el programa mediante la redirección de E/S:
redirección de salida: >
redirección de entrada: <
redirección de error: 2>
Ejemplos:
1. Guardamos el listado del directorio /etc en el fichero listado.txt
ls /etc > listado.txt
2. Hacemos que el comando grep utilice el contenido del fichero listado.txt para mostrar las líneas
que contienen la cadena “conf”.
grep conf < listado.txt
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 3
3. Hacemos que el error que genera la ejecución de un comando no válido se guarde en el fichero
error.txt
asdfg 2> error.txt
FILTRADO DE TEXTOS
Los comandos más habituales que permiten mostrar el contenido de un fichero son: cat, less y more.
Para filtrar la salida de estos comandos, se pueden utilizar los siguientes comandos:
grep: muestra las líneas que cumplen una determinada condición.
head: muestra las n primeras líneas.
tail: muestra las n últimas líneas.
cut: muestra una determinada columna.
sort: ordena la salida.
Ejemplos:
1. Mostrar las líneas del fichero /etc/passwd que contienen la palabra root:
less /etc/passwd | grep root
2. Mostrar las 5 primeras líneas del fichero /etc/passwd:
more /etc/passwd | head –n 5
3. Mostrar las 3 últimas líneas del fichero /etc/passwd:
cat /etc/passwd | tail –n 3
4. Obtener el nombre de todos los usuarios del sistema (primera fila del fichero /etc/passwd):
more /etc/passwd | cut –d: -f1
5. Mostrar ordenados alfabéticamente los nombres de usuario del equipo:
more /etc/passwd | cut –d “:” -f1 | sort
6. Mostrar los identificadores de los usuarios del sistema (tercera fila del fichero /etc/passwd) ordenados de forma ascendente:
less /etc/passwd | cut –d: -f3 | sort -n
Ejercicio: Escribir un guión que muestre todos los grupos de usuarios del sistema.
Ejercicio: Escribir un guión que indique cuál es el primer y el último identificador de usuario del sistema.
3. OPERACIONES ARITMÉTICO LÓGICAS
Para realizar operaciones aritmético-lógicas sobre variables se utiliza el comando expr. Para realizar
comparaciones se utiliza el comando test.
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 4
EXPR
Operadores de expr:
Operadores aritméticos Operadores relacionales Operadores lógicos
Operador Descripción Operador Descripción Operador Descripción
+ Suma = Igualdad | Or lógico
- Resta != Diferencia & And lógico
\* Multiplicación > Mayor
/ División < Menor
% Resto de división >= Mayor o igual
<= Menor o igual
Ejemplos:
1. Suma de dos números.
num1=6
num2=8
suma=`expr $num1 + $num2`
echo “Suma $num1 + $num2 = $suma”
2. Multiplicación de dos valores introducidos por teclado.
echo –n “Primer valor: ”
read var1
echo –n “Segundo valor: ”
read var2
resul=$(expr $var1 \* $var2)
echo “El resultado de la multiplicación es “ $resul
TEST
El comando test permite evaluar tres tipos de elementos: archivos, cadenas y números. Su sintaxis es:
test –opción archivo
test [ expresión ]
Sus opciones son:
Archivos o directorios
Opción Descripción
–f Devuelve verdadero (0) si el archivo existe y es un archivo regular.
–d Devuelve verdadero (0) si existe y es un directorio.
–s Devuelve verdadero (0) si el archivo existe y su tamaño es mayor que 0.
–r Devuelve verdadero (0) si el archivo existe y tiene permisos de lectura.
–w Devuelve verdadero (0) si el archivo existe y tiene permisos de escritura.
–x Devuelve verdadero (0) si el archivo existe y tiene permisos de ejecución.
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 5
Conectores Valores numéricos
Opción Descripción Opción Descripción
–o OR –eq Igual a
–a AND –ne No igual a
! NOT –gt Mayor que
–lt Menor que
–ge Mayor o igual que
–le Menor o igual que
Ejemplos:
1. Ver si un fichero es de tipo regular.
test –f /etc/passwd (echo $? devolverá 0)
test –f /etc (echo $? devolverá 1)
2. Comprobar que un fichero no es un directorio.
test ! –d /etc/passwd (echo $? devolverá 0)
test ! –d /etc (echo $? devolverá 1)
3. Comparar cadenas.
test [“Hola” = “hola”] (echo $? devolverá 1)
test [“hola” = “hola”] (echo $? devolverá 0)
4. Evaluación numérica (para número enteros).
test 5 –gt 8 (echo $? devolverá 1)
test 6 –le 6 (echo $? devolverá 0)
4. ESTRUCTURAS DE CONTROL
CONDICIONAL SIMPLE (if)
1. if-then
if <condición>
then
comandos fi
Si se cumple la condición se ejecutarán los comandos.
2. if-then-else
if <condición>
then
comandos1 else
comandos2 fi
Se evalúa la condición y si se cumple se ejecutan los comandos de la rama then, si no se cumple se ejecutan los comandos de la rama else.
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 6
3. if-then-elif-else
if <condición1>
then
comandos1 elif <condicion2>
then
comandos2 else
comandos3 fi
Se evalúa condición1, si se cumple se ejecutarán comandos1 de la rama del then, si no, se evalúa condición2, si se cumple se ejecutarán los comandos2 de la rama elif, y si no se cumple se ejecutarán los comandos3 de la rama else. elif es equivalente a un else if.
Ejemplos:
1. Comparar dos parámetros e indicar cuál es el mayor.
if [ $1 -gt $2 ]
then
echo "$1 es mayor que $2"
else
echo "$2 es mayor que $1"
fi
2. Comparar dos números e indicar cuál es el mayor, o si son iguales, si es el caso.
if [ $1 -ge $2 ]
then
if [ $1 -eq $2 ]
then
echo "$1 es igual a $2"
else
echo "$1 es mayor que $2"
fi
else
echo "$2 es mayor que $1"
fi
3. Pasar como parámetro un nombre de fichero. Si es de tipo regular, mostrar su contenido. Si es un directorio, mostrar el listado detallado de ficheros que contiene. Si no es ninguno de los dos anteriores, mostrar un mensaje que lo indique.
if test -f "$1" #Es un fichero?
then
more $1
elif test -d "$1" #Es un directorio?
then
ls -l $1
else #No es ni fichero ni directorio
echo "$1 no es ni fichero ni directorio"
fi
Ejercicios:
1. Escribe un guión que reciba como parámetro el nombre de un fichero e indique si tiene permisos de lectura, escritura o ejecución.
2. Escribe un guión que reciba como parámetros dos cadenas de caracteres, e indique si son o no iguales.
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 7
CONDICIONAL SIMPLE (case)
case $variable in
valor1) inst1; inst2; ...;;
valor2) instruccion1
instruccion2
instruccion3 ;;
*) instruc1; instruc2;...;;
esac
Evalúa el valor de la variable y ejecuta varias instrucciones en función de su valor. Es equivalente a usar ifs anidados, aunque más completo y organizado. Si la variable no es igual a ninguno de los valores especificados, se ejecutan las instrucciones especificadas en el asterisco.
Ejemplos:
1. Guión que pide al usuario un valor numérico y lo muestra escrito con caracteres.
echo –n “Introduce un valor: “
read var
case $var in
1) echo “ Uno “;; 2) echo “ Dos “;; 3) echo “ Tres “;; 4) echo “ Cuatro “;; *) echo “ No es ni 1, ni 2, ni 3 ni 4 “;;
esac
2. Guión que determina el número de parámetros que se le han pasado.
case $# in
0) echo "No has introducido ningún parámetro"
;;
1) echo "Has introducido un parámetro: $1"
;;
2) echo "Has introducido dos parámetros: $1 $2"
;;
*) echo "Has introducido más de dos parámetros"
;;
esac
BUCLE while
while <condición>
do
instrucción1
instrucción2
.....
done
Ejecutará las instrucciones mientras se cumpla la condición.
Ejemplos:
1. Contar del 1 hasta el 100.
conta=1
while [ $conta -le 100 ]
do
echo $conta
conta=`expr $conta + 1`
done
Unidad 12. Programación Shell.
2º ASIR – Administración de Sistemas Operativos 8
2. Tabla de multiplicar de un número.
echo "Dime un número: "
read num
i=0
while [ $i -le 10 ]
do
res=`expr $num \* $i`
echo "$num x $i = $res"
i=`expr $i + 1`
done
BUCLE for
1. for var in 1 2 3 4 5
do
echo $var
done
Imprime la lista 1 2 3 4 5.
2. for var in *
do
echo $var
done
Imprime el listado de ficheros del directorio actual.
El * lo sustituye por todos los ficheros del directorio actual.
3. for var in $*
do
echo $var
done
Imprime la lista de parámetros en la llamada al guión.
Ejercicios:
1. Escribe un guión que te vaya pidiendo números hasta que introduzcas el cero (0).
2. Escribe un guión al que se le pase como parámetros una lista de números e imprima por pantalla aquellos que sean impares.
3. Escribe un guión muestre el listado de ficheros del directorio actual indicando para cada caso si se trata de un fichero regular o de un directorio.