2012-09-27 30 views
14

Estoy tratando de hacer lo siguiente usando case en Bash (en Linux).Usando el caso para un rango de números en Bash

Si X está entre 460 y 660, da salida a la información X.

Si X está entre 661 y 800, haga otra cosa.

Etc.

En este momento esto es lo que tengo:

case $MovieRes in 
    [461-660]*) echo "$MovieName,480p" >> moviefinal ;; 
    [661-890]*) echo "$MovieName,720p" >> moviefinal ;; 
    [891-1200]*) echo "$MovieName,1080p" >> moviefinal ;; 
    *) echo "$MovieName,DVD" >> moviefinal ;; 
esac 

Pero de alguna manera muchos de los que son 480p, 720p o 1080p están terminando con DVD en su lugar. La variable $MovieRes es una lista simple que muestra, para cada línea, un número entre 1 y 1200. Dependiendo del valor, case decide qué "caso" aplicar.

Me gustaría saber cómo usar realmente case para lograr esto, ya que es un poco confuso cuando se trata de rangos como este.

+0

"Pero de alguna manera muchos de ellos" ... No estoy seguro de a qué 'ones' se refiere aquí. ¿Puedes aclarar? –

Respuesta

21

En bash, puede utilizar la arithmetic expression: declaración ((...))

if ((461<=X && X<=660)) 
then 
    echo "480p" 
elif ((661<=X && X<=890)) 
then 
    echo "720p" 
elif ((891<=X && X<=1200)) 
then 
    echo "1080p" 
else 
    echo "DVD" 
fi >> moviefinal 
19

La fiesta case no entiende series de números. Entiende shell patterns.

El siguiente debería funcionar:

case $MovieRes in 
    46[1-9]|4[7-9][0-9]|5[0-9][0-9]|6[0-5][0-9]|660) echo "$MovieName,480p" >> moviefinal ;; 
    66[1-9]|6[7-9][0-9]|7[0-9][0-9]|8[0-8][0-9]|890) echo "$MovieName,720p" >> moviefinal ;; 
    89[1-9]|9[0-9][0-9]|1[0-1][0-9][0-9]|1200)  echo "$MovieName,1080p" >> moviefinal ;; 
    *)            echo "$MovieName,DVD" >> moviefinal ;; 
esac 

Sin embargo, me gustaría recomendar que utiliza una instrucción if-else y comparar los rangos de números como en la otra respuesta. Un case no es la herramienta adecuada para resolver este problema. Esta respuesta es solo para propósitos explicativos.

+0

Gracias dogbane. Ahora aquí está el problema, la respuesta correcta respondió lo que estaba buscando, pero como también lo mencionó, esta no sería la forma correcta de hacerlo. La forma correcta/más fácil sería usar la respuesta de Kev. Debo: 1. Aceptar su respuesta como la respuesta correcta y otorgarle a Kev un +1 o 2. ¿Debo aceptar la respuesta de Kev como la correcta y darle un +1? Lo pregunto ya que ambos de alguna manera responden correctamente. –

+1

La respuesta de IMO kev debe aceptarse porque eso es lo que usted (y cualquier otra persona que visite este sitio) debería utilizar. ¡Pero no me importaría un +1! Gracias :) – dogbane

12

sólo por el placer de subvertir el caso de hacer lo que quiere, se puede utilizar $((...))

case 1 in 
    $(($MovieRes<= 460)))echo "$MovieName,???";; 
    $(($MovieRes<= 660)))echo "$MovieName,480p";; 
    $(($MovieRes<= 890)))echo "$MovieName,720p";; 
    $(($MovieRes<=1200)))echo "$MovieName,1080p";; 
         *)echo "$MovieName,DVD";; 
esac >> moviefinal 
0

problema similar que pudiera ser útil a alguien ... cosa adicional aleatoria Sólo traté de dónde cheques también que es un número entero, para mí quería que tuviera un valor preestablecido, dejar que el usuario lo cambie, si ingresan los datos incorrectos se establece en el valor predeterminado.

func_set_num_files(){ 
     echo "How many files do you want to create? (input a number 1-10000)" 
     read X 
     # 1, is it a number, #2 is it within max range? 
     if [[ $X != *[!0-9]* ]]; then 

      if ((1<=X && X<=10000)) ;then 
         echo "NUM_FILES=$X" 
         NUM_FILES=$X 
       else 
         echo "Invalid input, setting to default value [ $NUM_FILES ].";sleep 3 
      fi 

     else 
      echo "Invalid input, non-numeric values entered, setting to default value [ $NUM_FILES ].";sleep 3 
     fi 

    } 

Otro ejemplo usando 'caso' para comprobar que una variable se encuentra en un rango de enteros:

cheque que $ MAX es un número y que es entre 50-100:

  case $MAX in 
       ''|*[!0-9]*) 
        echo "The value $MAX is not a number !" 
        exit 1 
       ;; 
       *) 
        if [ $MAX -lt 50 ] || [ $MAX -gt 100 ] ;then 
         echo "The value $MAX is not between 50-100" 
         exit 1 
        fi 
        echo "Looks like we are good !" 
       ;; 
      esac 
Cuestiones relacionadas