[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: