Utilizzo di case per un intervallo di numeri in Bash

Sto cercando di fare quanto segue usando case in Bash (in Linux).

Se X è tra 460 e 660, invia le informazioni X.

Se X è tra 661 e 800, fai qualcos’altro.

Eccetera.

In questo momento questo è quello che ho:

 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 

Ma in qualche modo molti di quelli che sono 480p, 720p o 1080p finiscono invece con il DVD. La variabile $MovieRes è una semplice lista che mostra, per ogni riga, un numero compreso tra 1 e 1200. A seconda del valore, il case decide quale “caso” applicare.

Mi piacerebbe sapere come utilizzare effettivamente case per realizzare questo dato che è un po ‘di confusione quando si tratta di intervalli come questo.

In bash, puoi usare l’ 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 

L’istruzione case bash non comprende gli intervalli di numeri. Comprende i modelli di shell .

Il seguente dovrebbe funzionare:

 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 

Tuttavia, ti consigliamo di utilizzare un’istruzione if-else e confrontare gli intervalli numerici come nell’altra risposta. Un case non è lo strumento giusto per risolvere questo problema. Questa risposta è solo a scopo esplicativo.

Solo per il piacere di sovvertire il caso per fare quello che vuoi, puoi usare $((...))

 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 simile che potrebbe essere utile a qualcuno … Un’altra cosa a caso ho appena provato dove controlla anche che è un numero intero, per me volevo che avesse un valore preimpostato, che l’utente lo modificasse, se inseriva il valore sbagliato dati che imposta su default.

  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 } 

Un altro esempio che utilizza 'case' per verificare che una variabile si trovi in ​​un intervallo di numeri interi:

controlla che $ MAX sia un numero e che sia compreso tra 50 e 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