在Bash中使用一系列数字的大小写

Lui*_*ado 21 bash switch-statement

我试图case在Bash中使用(在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
Run Code Online (Sandbox Code Playgroud)

但不知何故,480p,720p或1080p的许多都以DVD结尾.变量$MovieRes是一个简单的列表,为每行显示1到1200之间的数字.根据值,case决定应用哪个"case".

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

kev*_*kev 28

在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
Run Code Online (Sandbox Code Playgroud)


dog*_*ane 25

bash case语句不理解数字范围.它了解shell模式.

以下应该有效:

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
Run Code Online (Sandbox Code Playgroud)

但是,我建议您使用if-else语句并比较其他答案中的数字范围.A case不是解决此问题的正确工具.这个答案仅供参考.


小智 17

只是为了根据需要颠覆案件的乐趣,你可以使用 $((...))

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
Run Code Online (Sandbox Code Playgroud)

  • 嗯,看起来“case 1 in”本质上等于“case true in”?也就是说,如果公式返回 true 就满足情况?这是“case”的一个很酷的用法! (2认同)