[ Más información sobre nuestros banners ]

Entrega 45. Shell Script (IV)

Documento creado por: videoedicion.org el 01/1/2011
              
Descargar en PDF | Imprimir | Agregar a favoritos

Una forma más limpia de usar if.

Hay otra forma de escribir nuestros scripts sin usar directamente el comando 'test' en las condiciones como los if, aunque en el fondo es exactamente lo mismo y las opciones las mismas que las del cuadro de 'test' mostradas en la entrega anterior.

[ expr ]

Donde 'expr' es una expresión del mismo modo que las del comando 'test', con lo cual el último ejemplo de la entrega anterior quedaría de la siguiente forma:

#! /bin/bash

if [ $# -ne 2 ]
then
  echo Se necesitan 2 números
  return 1
fi

if [ $1 -lt $2 ]
then
  echo $1 es menor que $2
else
  if [ $1 -gt $2 ]
  then
    echo $1 es mayor que $2
  else
    echo $1 es igual que $2
  fi
fi

return 0

De ejecución:

matados2k@imperio:~/curso$ sh ejemplo45.sh
Se necesitan 2 números
matados2k@imperio:~/curso$ sh ejemplo45.sh 2 4
2 es menor que 4
matados2k@imperio:~/curso$ sh ejemplo45.sh 4 2
4 es mayor que 2
matados2k@imperio:~/curso$

Es muy importante dejar espacios en blanco después de '[' y antes de ']' o no funcionará. Personalmente, para mí esta forma es más limpia y más legible que usar 'test' directamente, cada uno lo que más le guste.

Realmente, el uso de '[ ' es ' ]' es una referencia al comando 'test' dentro del intérprete de bash.

Estructura condicional case.

En algunas ocasiones nos encontramos con unas estructuras if .. then ... else if ... anidadas para ver las múltiples opciones de una variable, por poner un ejemplo. En ese caso es mucho mejor usar una estructura como 'case':

        case variable in

	patrón1) 
lista de comandos

;;

patrón2|patrón3)
lista de comandos

;;

patrónN)
lista de comandos

;;

esac


El comportamiento de esta estructura es el siguiente: según la variable se van mirando los patrones, cuando se encuentre uno que coincida se ejecuta la lista de comandos hasta los ';;' y se termina la ejecución de la estructura 'case'. El patrón es el valor que uno espera encontrarse y pueden usarse cualquiera de los siguientes comodines, al igual que en la línea de comandos: ? comprueba un carácter * comprueba cualquier número de cualquier tipo de caracteres [nnn] comprueba cualquiera de los caracteres entre corchetes [!nnn] comprueba cualquier carácter que no este entre los corchetes [n-n] comprueba cualquier carácter en el rango

Para terminar de comprender el uso de 'case' veamos un ejemplo de un script con 'if' y luego lo pasamos a 'case':

#! /bin/bash

if [ $# -ne 3 ]
then
  echo Se necesitan 3 parámetros
  return 1
fi

if [ $1 = "suma" ]
then
  echo $(($2+$3))
fi
if [ $1 = "resta" ]
then
  echo $(($2-$3))
fi
if [ $1 = "multiplicacion" ]
then
  echo $(($2*$3))
fi
if [ $1 = "division" ]
then
  echo $(($2/$3))
fi

return 0

De ejecución:

matados2k@imperio:~/curso$ sh ejemplo45.sh
Se necesitan 3 parámetros
matados2k@imperio:~/curso$ sh ejemplo45.sh suma 2 2
4
matados2k@imperio:~/curso$ sh ejemplo45.sh resta 2 2
0
matados2k@imperio:~/curso$ sh ejemplo45.sh multiplicacion 2 2
4
matados2k@imperio:~/curso$ sh ejemplo45.sh division 2 2
1
matados2k@imperio:~/curso$

Antes de seguir y ya que acabo de utilizarlo, para realizar operaciones aritméticas se usa “$(( ))” o si no probad, probad ...

Y su versión en 'case':

#! /bin/bash

if [ $# -ne 3 ]
then
  echo Se necesitan 3 parámetros
  return 1
fi

case $1 in
"suma")
  echo $(($2+$3))
;;
"resta")
  echo $(($2-$3))
;;
"multiplicacion")
  echo $(($2*$3))
;;
"division")
  echo $(($2/$3))
;;
esac

return 0

De ejecución:

matados2k@imperio:~/curso$ sh ejemplo45.sh
Se necesitan 3 parámetros
matados2k@imperio:~/curso$ sh ejemplo45.sh suma 2 2
4
matados2k@imperio:~/curso$ sh ejemplo45.sh resta 2 2
0
matados2k@imperio:~/curso$ sh ejemplo45.sh multiplicacion 2 2
4
matados2k@imperio:~/curso$ sh ejemplo45.sh division 2 2
1
matados2k@imperio:~/curso$

Como podemos observar, el uso de 'case' nos facilita la labor y hace el código más legible en casos como éste.

Ahora veamos el mismo ejemplo de 'case' pero aplicando comodines:

#! /bin/bash

if [ $# -ne 3 ]
then
  echo Se necesitan 3 parámetros
  return 1
fi

case $1 in
"s"*)
  echo $(($2+$3))
;;
"r"*)
  echo $(($2-$3))
;;
"m"*)
  echo $(($2*$3))
;;
"d"*)
  echo $(($2/$3))
;;
esac

return 0

De ejecución:

matados2k@imperio:~/curso$ sh ejemplo45.sh sum 2 2
4
matados2k@imperio:~/curso$ sh ejemplo45.sh r 2 2
0
matados2k@imperio:~/curso$ sh ejemplo45.sh matados2k 2 2
4
matados2k@imperio:~/curso$ sh ejemplo45.sh dipas 2 2
1
matados2k@imperio:~/curso$

Como veis, en este último caso he usado el comodín '*' para indicarle a 'case' que sólo es necesario que coincida la primera letra y el resto desde 0 a cualquier número de caracteres.

Despedida.

Sin más, os espero la semana que viene, donde veremos estructuras como 'for' o 'while'.

Agradecimientos:

· Revisión del documento: karuchi (Carolina García).

Página oficial y dominio de mi propiedad http://matados2k.es

Matados'2k Usuario y moderador de foro.noticias3d.com

Matados'2k Usuario y moderador de www.sinuh.org

,

matados2k (arroba) gmail (punto) com

Este documento está sometido a la licencia de creative commons en su variante “Reconocimiento-NoComercial-SinObraDerivada 2.5 España” . Es de agradecer que se comunique al autor el uso de este documento en otro medio y se debe incluir de forma obligatoria este recuadro y los agradecimientos.

¿Encuentras este artículo de utilidad?

Si No

Categoría: Curso desde 0 de GNU/Linux

Última actualización: 01/1/2011
Visitas: 14405