我可以使用比较运算符吗?

jes*_*e_b 4 bash case

我正在构建一个函数,该函数将计算给定安培数、距离(以英尺为单位)和允许电压降所需的电线规格。

给定这些值,我可以计算出“圆形密耳”,从而得到AWG 要求。我开始构建一个大型if elif声明来将圆形密耳与其受人尊敬的仪表进行比较,但我相信这case是正确的工具。

我还没有找到任何用于比较数字的案例示例,所以我想知道是否可以执行以下操作:

what.gauge () {

    let cmils=11*2*$1*$2/$3
    let amils=17*2*$1*$2/$3


    case $cmils in

        320-403)
            cawg="25 AWG"
            ;;
        404-509)
            cawg="24 AWG"
            ;;
        510-641)
            cawg="23 AWG"
            ;;

        etc...

}
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 10

POSIX 外壳

由于您正在寻找算术测试并且 case 不进行算术运算,因此if-then似乎是自然的方法:

if [ "$cmils" -lt 320 ]
then
        cawg="??"
elif [ "$cmils" -le 403 ]
then
        cawg="25 AWG"
elif [ "$cmils" -le 509 ]
then
        cawg="24 AWG"
elif [ "$cmils" -le 641 ]
then
        cawg="23 AWG"
fi
Run Code Online (Sandbox Code Playgroud)

仅限 Bash

我更喜欢便携式解决方案,但有些人迷恋 bash 的算术语法:

if ((cmils < 320))
then
        cawg="??"
elif ((cmils <= 403))
then
        cawg="25 AWG"
elif ((cmils <= 509))
then
        cawg="24 AWG"
elif ((cmils <= 641))
then
        cawg="23 AWG"
fi
Run Code Online (Sandbox Code Playgroud)

这比 POSIX 语法更强大也更脆弱。要了解原因,请在设置后尝试此代码cmils=cmils


Hau*_*ing 5

case $cmils in

    3[2-9][0-9]|40[0-3])
        cawg="25 AWG"
        ;;
    40[4-9]|4[1-9][0-9]|50[0-9])
        cawg="24 AWG"
        ;;
    51[0-9]|6[0-3][0-9]|64[01])
        cawg="23 AWG"
        ;;
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,这就是所问问题的答案。我不想成为维护此代码的人。 (14认同)
  • @glennjackman 写它甚至都不好玩。如果出于某种原因必须使用类似的东西,那么您将编写一个函数来生成正则表达式,并且只在“case”选择器中使用变量。 (2认同)
  • 国际混淆 Bash 大赛有人吗?:) (2认同)

cas*_*cas 5

正如其他人所说,case不支持比较运算符,只支持 glob 模式匹配。

但是,您可以通过不同的格式来使一组 if/elif/fi 语句看起来更像一个 case 语句。例如,基于 John1024 的回答:

if   [ "$cmils" -lt 320 ]; then cawg='??'
elif [ "$cmils" -le 403 ]; then cawg='25 AWG'
elif [ "$cmils" -le 509 ]; then cawg='24 AWG'
elif [ "$cmils" -le 641 ]; then cawg='23 AWG'
fi
Run Code Online (Sandbox Code Playgroud)

甚至:

[ "$cmils" -ge 320 ] && [ "$cmills" -le 403 ] && cawg='25 AWG'
[ "$cmils" -ge 404 ] && [ "$cmills" -le 509 ] && cawg='24 AWG'
[ "$cmils" -ge 510 ] && [ "$cmills" -le 641 ] && cawg='23 AWG'
Run Code Online (Sandbox Code Playgroud)

注意:与使用 的任何东西不同elif,此变体的缺点是至少运行这些行中的每一行的第一个测试。elif在任何测试评估为真后,使用将跳过所有剩余的测试。你可以把这样的东西放在一个函数中并&& return在设置后添加cawg

我个人发现其中任何一个都更具可读性(没有所有额外的换行符和交替缩进使事情变得混乱),但是对于这个特定的编码风格/缩进问题,意见分歧很大:)

由于所有内容都排列在相同(或非常接近)的列上,因此它们也更容易进行复制、粘贴和编辑。这在使用一个真正的编辑器时很好。