miércoles, 17 de mayo de 2017

Realizando múltiples acciones

En versiones de bash anteriores a la 4.0, case sólo permitía realizar una única acción en una coincidencia exitosa. Tras una coincidencia exitosa, el comando terminaría. Aquí vemos un script que prueba un carácter:

#!/bin/bash

# case4-1: test a character

read -n 1 -p "Type a character > "
echo
case $REPLY in
   [[:upper:]])  echo "'$REPLY' is upper case." ;;
   [[:lower:]])  echo "'$REPLY' is lower case." ;;
   [[:alpha:]])  echo "'$REPLY' is alphabetic." ;;
   [[:digit:]])  echo "'$REPLY' is a digit." ;;
   [[:graph:]])  echo "'$REPLY' is a visible character." ;;
   [[:punct:]])  echo "'$REPLY' is a punctuation symbol." ;;
   [[:space:]])  echo "'$REPLY' is a whitespace character." ;;
   [[:xdigit:]]) echo "'$REPLY' is a hexadecimal digit." ;;
esac

Ejecutar este script produce esto:

[me@linuxbox ~]$ case4-1
Type a character > a
'a' is lower case.

Gran parte del script funciona, pero falla si un carácter coincide con más de una de las clases de caracteres POSIX. Por ejemplo, el carácter "a" es tanto una letra minúscula como una letra del alfabeto, así como un dígito hexadecimal. En bash anterior a la versión 4.0 no había forma de que case coincidiera en más de una prueba. Las versiones modernas de bash, añaden la notación ";;&" para terminar cada acción, así que podemos hacer esto:

#!/bin/bash

# case4-2: test a character


read -n 1 -p "Type a character > "

echo
case $REPLY in
   [[:upper:]])  echo "'$REPLY' is upper case." ;;&
   [[:lower:]])  echo "'$REPLY' is lower case." ;;&
   [[:alpha:]])  echo "'$REPLY' is alphabetic." ;;&
   [[:digit:]])  echo "'$REPLY' is a digit." ;;&
   [[:graph:]])  echo "'$REPLY' is a visible character." ;;&
   [[:punct:]])  echo "'$REPLY' is a punctuation symbol." ;;&
   [[:space:]])  echo "'$REPLY' is a whitespace character." ;;&
   [[:xdigit:]]) echo "'$REPLY' is a hexadecimal digit." ;;&
esac

Cuando ejecutamos este script, obtenemos esto:

[me@linuxbox ~]$ case4-2
Type a character > a
'a' is lower case.
'a' is alphabetic.
'a' is a visible character.
'a' is a hexadecimal digit.

Añadir la sintaxis ";;&" permite que case continúe con el siguiente test en lugar de simplemente terminar.

No hay comentarios:

Publicar un comentario