在Bash中使用大小写范围的数字

我正在尝试在Bash中使用case (在Linux中)。

如果X在460和660之间,则输出X信息。

如果X在661和800之间,则做其他事情。

等等。

现在这是我有:

 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 

但不知何故480p,720p或1080p的很多都是以DVD结尾的。 variables$MovieRes是一个简单的列表,对每一行显示一个介于1和1200之间的数字。根据这个值, case决定应用哪个“case”。

我想知道如何实际使用case来完成这个,因为处理这样​​的范围有点混乱。

在bash中,可以使用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 

bash case语句不理解数字范围。 它了解壳模式 。

以下应该工作:

 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 

不过,我build议你使用一个if-else语句,并在另一个答案中比较数字范围。 case不是解决这个问题的正确工具。 这个答案只是为了解释的目的。

只是为了颠覆的情况下做任何事情的乐趣,你可以使用$((...))

 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 

类似的问题,可能是有用的人…随机附加的东西,我刚刚试过,它也检查它是一个整数,对我来说,我希望它有一个预设值,让用户改变它,如果他们input错误数据设置为默认值。

  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 } 

另一个使用'case'来检查一个variables是否在整数范围内的例子:

检查$ MAX是一个数字,它是在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