Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中一系列数字的用例_Bash_Switch Statement - Fatal编程技术网

Bash中一系列数字的用例

Bash中一系列数字的用例,bash,switch-statement,Bash,Switch Statement,我正在尝试在Bash(Linux)中使用case执行以下操作 如果X在460和660之间,则输出X信息 如果X在661和800之间,请执行其他操作 等等 这就是我现在所拥有的: case $MovieRes in [461-660]*) echo "$MovieName,480p" >> moviefinal ;; [661-890]*) echo "$MovieName,720p" >> moviefinal ;; [891-1200]*) ec

我正在尝试在Bash(Linux)中使用
case
执行以下操作

如果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”


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

在bash中,可以使用
算术表达式:
(…)


if((461bash
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

但是,我建议您使用if-else语句,并与另一个答案中的数字范围进行比较。
案例
不是解决此问题的正确工具。此答案仅用于解释目的。

只是为了方便您按照自己的意愿颠覆案例, 您可以使用
$(…)

中的案例1

$($MovieRes类似的问题,可能对某些人有用…随机附加的东西我刚刚尝试过,它检查它是否是一个整数,对我来说,我希望它有一个预设值,让用户更改它,如果他们输入了错误的数据,它设置为默认值

    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语句

最后,我为zsh找到了一个非常简单的解决方案:

  #!/usr/bin/zsh 

 case "${var}" in

 <0-5461>)

 printf "${var} is between 0 and 5461"

 ;;

 <5462-10922>)

printf "${var} is between 5462-10922"

 ;;

 esac
  #!/bin/bash

 case $((   

(var >= 0 && var <= 5461)      * 1 +   

(var > 5462 && var  <= 10922)   * 2)) in   

(1) printf "${var} is between 0 and 5461";; 

(2) printf "${var} is between 5461 and 10922";; 

esac
!/usr/bin/zsh
中的大小写“${var}”
)
printf“${var}介于0和5461之间”
;;
)
printf“${var}介于5462-10922之间”
;;
以撒
对于Bash

  #!/usr/bin/zsh 

 case "${var}" in

 <0-5461>)

 printf "${var} is between 0 and 5461"

 ;;

 <5462-10922>)

printf "${var} is between 5462-10922"

 ;;

 esac
  #!/bin/bash

 case $((   

(var >= 0 && var <= 5461)      * 1 +   

(var > 5462 && var  <= 10922)   * 2)) in   

(1) printf "${var} is between 0 and 5461";; 

(2) printf "${var} is between 5461 and 10922";; 

esac
!/bin/bash
个案$(

(var>=0&&var 5462&&var“但不知何故,其中有许多”…我不太确定这里指的是哪些<代码>的<代码>的。你能澄清一下吗?谢谢你。现在问题出在这里,你的答案正确地回答了我想要的,但正如你提到的,这不是正确的方法。正确/更简单的方法是使用Kev的答案。我应该:1.接受你的答案吗作为正确答案,给Kev a+1或2。我应该接受Kev的正确答案,给你a+1吗?我问,因为你们两个都回答正确。IMO Kev的答案应该被接受,因为这是你(和任何其他来到这个网站的人)应该使用的。但我不介意a+1!谢谢:)感谢您提出了一种在
case
语句中声明数字范围的方法,而不仅仅是建议它需要是
if
:-)嗯,看起来
中的案例1本质上等于
中的案例true?也就是说,如果公式返回true,则满足案例要求?这是
案例
的一个很酷的用法!您的zsh解决方案正是我想要的!非常感谢!
  #!/bin/bash

 case $((   

(var >= 0 && var <= 5461)      * 1 +   

(var > 5462 && var  <= 10922)   * 2)) in   

(1) printf "${var} is between 0 and 5461";; 

(2) printf "${var} is between 5461 and 10922";; 

esac