首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash语句帮助变量如dl=40.00;$dl < 500

Bash语句帮助变量如dl=40.00;$dl < 500
EN

Unix & Linux用户
提问于 2020-06-01 11:44:13
回答 2查看 75关注 0票数 1
代码语言:javascript
复制
downloadspeed=800.00
dl="$downloadspeed/1" | bc
if [ $((dl)) -lt 500 ]
then
    echo "slow - send slow message"
else
    echo "fast - no issue"
fi

我做错了什么?我尝试了许多变体来测试$downloadspeed,这就是我停止的地方。似乎无论我如何测试它,它都是把我的变量当作字符串。$downloadspeed < 500,$dl < 500,"$dl“<500等,尝试了这么多的变化。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-06-01 11:51:35

错误的第一件事是分配给dl

代码语言:javascript
复制
dl="$downloadspeed/1" | bc

这意味着“将变量$dl设置为字符串800.00/1,然后将变量赋值的输出传递给bc”。由于赋值没有输出,结果就是将dl设置为800.00

但是,这一点很重要,管道在它们自己的子shell中运行,并且在该子shell中设置的任何变量都不会对父shell可用。这意味着,即使这个赋值实际上正在执行您希望它做的事情,dl仍然只会在管道运行时被设置,并且将在脚本本身中被取消设置。

然后,你运行这个:

代码语言:javascript
复制
if [ $((dl)) -lt 500 ]

这意味着“如果将$dl变量的内容作为算术表达式命令执行的结果小于500,则需要将dl的值设置为有效的算术表达式。例如:

代码语言:javascript
复制
800/1

但是您拥有的是一个空变量,因为如上所述,$dl在运行管道的子subshell中只有一个值。

无论如何,这都是不必要的复杂。为什么不这样做呢?

代码语言:javascript
复制
#!/bin/sh

downloadspeed=800.00
value=$(printf '%s\n' "$downloadspeed"/1 | bc)
if [ $value -lt 500 ]
then
    echo "slow - send slow message"
else
    echo "fast - no issue"
fi

下一次,要调试这些问题,可以使用set -x。将其添加到脚本的开头:

代码语言:javascript
复制
#!/bin/sh
set -x
downloadspeed=800.00
dl="$downloadspeed/1" | bc
if [ $((dl)) -lt 500 ]
then
    echo "slow - send slow message"
else
    echo "fast - no issue"
fi

如果您现在运行您的脚本,您将确切地看到正在执行哪些命令:

代码语言:javascript
复制
$ foo.sh
+ downloadspeed=800.00
+ dl=800.00/1
+ bc
+ '[' 0 -lt 500 ']'
+ echo 'slow - send slow message'
slow - send slow message

正如您所看到的,因为$dl是空的,但是在算术表达式($(( )))中使用,这个表达式被求值为0,您实际上正在运行[ 0 -lt 500 ],这始终是正确的。

票数 2
EN

Unix & Linux用户

发布于 2020-06-01 12:27:34

只需使用带有浮点算术支持的shell,如zsh (您已经在编写zsh语法,而不是引用您的$((dl))),而不是bash,然后做:

代码语言:javascript
复制
downloadspeed=800.00
if ((downloadspeed < 500))
then
    echo "slow - send slow message"
else
    echo "fast - no issue"
fi

对于不支持浮点算法的bash或POSIX sh语法,您可以调用awk进行比较:

代码语言:javascript
复制
compare() { # args:   
  POSIXLY_CORRECT=1 awk -- "
    BEGIN {exit(!((0+ARGV[1]) $2 (0+ARGV[2])))}" "$1" "$3"
}

if compare "$downloadspeed" '<' 500
then
    echo "slow - send slow message"
else
    echo "fast - no issue"
fi

POSIXLY_CORRECT=1有助于防止您的awk是GNU实现,从而使它识别更多的数字形式(如infinity0x100x1p4.YMMV和其他实现)。--帮助使用较早版本的busybox awk,否则它会将负数视为选项。0+将强制在诸如compare '8 apples' '<' '10 bananas'这样的事情上进行数值比较(在这种情况下,后面的文本被忽略了),而不是诉诸字符串比较。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/590229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档