Usando el caso para un rango de números en Bash

Estoy tratando de hacer lo siguiente usando case en Bash (en Linux).

Si X está entre 460 y 660, muestra información de 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 terminan en DVD. La variable $MovieRes es una lista simple que muestra, para cada línea, un número entre 1 y 1200. Dependiendo del valor, el case decide qué “caso” aplicar.

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

En bash, puede usar la arithmetic expression : ((...))

 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 

El enunciado de case bash no comprende los rangos numéricos. Comprende los patrones de concha .

Lo 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, te recomendaría que uses una statement if-else y compares los rangos numéricos como en la otra respuesta. Un case no es la herramienta adecuada para resolver este problema. Esta respuesta es solo para propósitos explicativos.

Solo por el placer de subvertir el caso para hacer lo que quiera, puede usar $((...))

 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 

Problema similar que podría ser útil para alguien … Algo adicional aleatorio. Probé donde comprueba también que es un número entero. Para mí, quería que tuviera un valor preestablecido, dejar que el usuario lo cambie, si ingresa un error. datos que establece de forma predeterminada.

  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 que usa 'caso' para verificar que una variable esté en un rango de números enteros:

compruebe que $ MAX es un número y que está 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