【问题标题】:Linux Bash scripting how to use a range of parametersLinux Bash 脚本如何使用一系列参数
【发布时间】:2015-08-07 03:19:38
【问题描述】:

如何在 linux bash 中使用一系列参数,例如 60-70 --> ($1 - $2)

case $1 in
           $1-$2 )
                echo "test"
                shift;;

         ....) .... 

【问题讨论】:

  • 你不能。 case 语句中的子句必须是单个值。您基本上是在将 $1$1-$2 生成的字符串进行字面比较,例如case 'foo' IN 'foo-bar')
  • 它们不必是单个值;它们可以是模式。然而,模式不能很好地处理数字范围。
  • 好的,谢谢,但我需要一个解决方案,你能帮我吗? @chepner
  • @MarcB 你能给我一个解决方案吗?
  • 即使我们有数字范围模式匹配语法,$1 总是将在(包括)范围内 $1-$2。这使得有人很难展示从您的代码派生的工作示例。也许您的意思是检查$1 是否在$2$3 之间的范围内? (如果是这样,你有任何保证,如果这些是大于或小于另一个?)

标签: linux bash command-line scripting


【解决方案1】:

case 语句的每个 case 都是一个模式,但根据范围,指定一个好的模式可能很棘手。例如,60-70 可以匹配

case $1 in
    6[0-9] | 70) echo "test"
                 shift ;;

本质上,您必须将数字视为数字字符串,并将它们作为文本进行匹配。例如,像 67-93 这样的范围分解为相当笨拙的范围

6[7-9] | [78][0-9] | 9[0-3]

【讨论】:

    【解决方案2】:

    你可以为它创建一个函数。
    当您有不同的范围时,请设置范围(检查、最小值、最大值)等参数。
    当检查

    range() {
       if [ "$1" -lt "$2" ]; then
          return 1
       fi
       if [ "$1" -gt "$3" ]; then
          return 2
       fi
       return 0
    }
    

    当您想要不同范围的不同回报时,请更改此功能。 编辑:添加引号并获得正返回值。 编辑 2:将 function x 更改为 x()

    【讨论】:

    • 需要更多的引号来避免一些错误的值(空值、多字值、全局字符等)导致测试命令语法错误,而不是(更传统的)无效比较数据错误。如果您要使用与 POSIX 不兼容的 function 关键字,为什么不全力以赴并使用非 POSIX 数学语法呢? if (( $1 < $3 )) 等。另外,-1 不是有效的返回值;只允许使用单字节整数,因此当前在处理的第一种情况下会出错并退出。
    猜你喜欢
    • 2021-06-07
    • 2023-03-23
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多