2012-09-27 23 views
14

我想在Bash(在Linux中)使用case执行以下操作。在Bash中使用大小写范围的案例

如果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,而不是结束的人的。变量$MovieRes是一个简单的列表,对每行显示1到1200之间的数字。根据值,case决定应用哪个“案例”。

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

+0

“但不知何故,许多人”......我不太确定这里提到的是哪一个。你能澄清吗? –

回答

21

在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 
19

bash的case语句不明白号范围。它理解shell patterns

下面应该工作:

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 

不过,我建议你使用if-else语句和比较数字范围为对方的回答。 A case不是解决此问题的正确工具。此答案仅用于解释目的。

+0

谢谢dogbane。现在是问题所在,你回答正确的回答了我正在寻找的内容,但正如你所提到的,这不是正确的做法。正确/简单的方法是使用Kev的答案。我应该:1.接受你的答案作为正确的答案,并给予Kev a +1或2.我应该接受Kev答案作为正确答案并给你+1。因为你们都以某种方式正确回答,所以我问。 –

+1

IMO kev的答案应该被接受,因为那是你(和任何来到这个网站的人)应该使用的。但我不介意+1!谢谢 :) – dogbane

12

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

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

这可能是有用的人类似问题的乐趣...随机附加的东西我只是想出来,它检查也是它是一个整数,对我来说我希望它有一个预设值,让用户改变它,如果他们输入了它设置为默认的错误数据。使用“的情况下”来检查一个变量是在一个范围内的整数的

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 

    } 

又如:

支票,$ 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