Unidad 12 - Programación Shell

8
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 $*

description

Unidad 12 ASO Programación Shell

Transcript of Unidad 12 - Programación Shell

Page 1: 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 $*

Page 2: Unidad 12 - Programación Shell

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

Page 3: Unidad 12 - Programación Shell

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.

Page 4: Unidad 12 - Programación Shell

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.

Page 5: Unidad 12 - Programación Shell

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.

Page 6: Unidad 12 - Programación Shell

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.

Page 7: Unidad 12 - Programación Shell

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

Page 8: Unidad 12 - Programación Shell

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.