¿Cómo hacer que una caja de interruptor Bash coincida con las condiciones de rango de números múltiples?


Estoy ejecutando switch case con número de columna, mis números de columna pueden ser 0 -50. Cuando se ejecuta en bucle, se validan. Ahora cada caso es compatible con el número de columna discreta y observo su fracaso. Ejemplo: mi número de columna es 10, y aquí está el código -

    i=10
    a=1
    b=0.65
    if [ "$a" != "$b" ] ; then 
       case $i in  
            [1]|[2]|[5]) echo "Not OK"; ;; 
            [9-10]|[12]) echo "may be ok"; ;; 
            *) echo "no clue - $i"; ;; 
       esac; 
   fi

Espero que "puede estar bien" pero no tengo ninguna pista-10

2 answers

Bash case no funciona con rangos de números. [] es para patrones de shell.

Por ejemplo, este caso [1-3]5|6) funcionará para 15 o 25 o 35 o 6.

Su código debería tener este aspecto:

i=10
a=1
b=0.65
if [ "$a" != "$b" ] ; then
   case $i in
        1|2|5) echo "Not OK"; ;;
        9|10|12) echo "may be ok"; ;;
        *) echo "no clue - $i"; ;;
   esac;
fi

Si i puede ser real entre 9 y 10, entonces necesitarás usar if (en lugar de case) con rangos.

 79
Author: Arnon Zilca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-25 09:29:59

if y [ solución

arg=1
if [ "$arg" -lt 5 ]; then
  echo 'less than 5'
elif [ "$arg" -lt 15 ]; then
  echo 'less than 15'
elif [ "$arg" -eq 17 ] || [ "$arg" -eq 19 ]; then
  echo '17 or 19'
else
  echo 'neither'
fi

POSIX 7

Bash sigue a POSIX como se menciona en https://stackoverflow.com/a/25482040/895245

Aquí está la cita: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 sección "Construcción condicional de caso":

El caso de construcción condicional ejecutará la lista compuesta correspondiente al primero de varios patrones (ver Coincidencia de patrones Notación) [...] Los patrones múltiples con la misma lista compuesta estarán delimitados por el símbolo"|". [...]

El formato para la construcción case es el siguiente:

case word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac

Y luego http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 sección "2.13. Notación de coincidencia de Patrones " dice:

[Si un corchete abierto introduce una expresión de corchete como en XBD RE Expresión de corchete

Y regular extendido expressions apunta a la sección "9.3.5 RE Bracket Expression" que dice:

Una expresión entre corchetes (una expresión encerrada entre corchetes, " []") es un RE que coincidirá con un conjunto específico de caracteres individuales, y puede coincidir con un conjunto específico de elementos de recopilación de caracteres múltiples, basado en el conjunto no vacío de expresiones de lista contenidas en la expresión entre corchetes.

Así que solo se consideran caracteres individuales cuando se hace algo como:

[9-10]
 4
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 19:44:06