我正在构建一个函数,该函数将计算给定安培数、距离(以英尺为单位)和允许电压降所需的电线规格。
给定这些值,我可以计算出“圆形密耳”,从而得到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
由于您正在寻找算术测试并且 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 的算术语法:
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
。
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)
正如其他人所说,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
。
我个人发现其中任何一个都更具可读性(没有所有额外的换行符和交替缩进使事情变得混乱),但是对于这个特定的编码风格/缩进问题,意见分歧很大:)
由于所有内容都排列在相同(或非常接近)的列上,因此它们也更容易进行复制、粘贴和编辑。这在使用一个真正的编辑器时很好。
归档时间: |
|
查看次数: |
3451 次 |
最近记录: |