Re: (OT):Error en scrpt en bash.
Los aspectos que detecté:
1) Te recomiendo que investigues sobre las diferencias entre `[',
`[[', y `((' para pruebas en bash. En específico, [ ... ] es la forma
POSIX de hacer pruebas, sin embargo, es suceptible a errores comunes
como olvidar entrecomillar los argumentos ( nunca hacer [ $foo = $bar
], la forma correcta es [ "$foo" = "$bar" ]). `[[' es la versión en
esteroides de `['. Tiene más funciones, como expresiones regulares y
agrupamiento de condiciones.
Pero para pruebas aritméticas, te recomiendo que uses (( ... )).
Esta forma permite evaluar expresiones aritméticas estilo C, por
ejemplo:
while ((radioelegida != 1)); do
...
done
Nota, la sintaxis es (( ... )), no ( (...) ) o cualquier otra
variante.
2) `read' recibe como argumento un nombre de variable. Tú le estás
pasando el VALOR de la variable:
read radioelegida <- nombre
read $radioelegida <- valor (expansión de variable)
Además, se recomienda usar siempre -r con read, para evitar que
remueva los \'s. Así que eso se convierte en:
read -r radioelegida
3) Cuando hagas pruebas con [ ... ] o [[ ... ]] no olvides los ESPACIOS!
- [ "$a" = "$b" ] -> BIEN
- [ "$a"="$b" ] -> MAL
- ["$a"="$b"] -> MAL
- ["$a" = "$b"] -> MAL
La razón de esto es que `[' es como cualquier otro comando: sus
argumentos van separados por espacios. [a=b] es un solo comando,
[ a = b ] es el comando `[', con argumentos `a', `=', `b', y `]'.
4) Puedes utilizar el comando `select' que sirve precisamente para
esto:
# PS3 es el mensaje que se muestra en la pregunta
PS3='Selecciona una opción (o 0 para cancelar)> ';
# Las comillas se usan para encapsular las posibilidades.
select opcion in 'FM rock and pop' 'FM pop'; do
# REPLY es una variable automática, que se llena con lo que
# el usuario capturó.
[[ $REPLY = 0 ]] && break;
# Usamos [[ ]] en vez de (( )) por si el usuario ingresa un
# dato no numérico, si lo hace, (( ... )) marcaría error.
case $REPLY in
1) echo opcion 1;;
2) echo opcion 2;;
*) echo opcion no válida;;
esac;
done
--
Eduardo Alan Bustamante López
##bash-es en Freenode (soporte de Bash/sh en español)
Reply to: