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等,尝试了这么多的变化。
发布于 2020-06-01 11:51:35
错误的第一件事是分配给dl:
dl="$downloadspeed/1" | bc这意味着“将变量$dl设置为字符串800.00/1,然后将变量赋值的输出传递给bc”。由于赋值没有输出,结果就是将dl设置为800.00。
但是,这一点很重要,管道在它们自己的子shell中运行,并且在该子shell中设置的任何变量都不会对父shell可用。这意味着,即使这个赋值实际上正在执行您希望它做的事情,dl仍然只会在管道运行时被设置,并且将在脚本本身中被取消设置。
然后,你运行这个:
if [ $((dl)) -lt 500 ]这意味着“如果将$dl变量的内容作为算术表达式命令执行的结果小于500,则需要将dl的值设置为有效的算术表达式。例如:
800/1但是您拥有的是一个空变量,因为如上所述,$dl在运行管道的子subshell中只有一个值。
无论如何,这都是不必要的复杂。为什么不这样做呢?
#!/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。将其添加到脚本的开头:
#!/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如果您现在运行您的脚本,您将确切地看到正在执行哪些命令:
$ 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 ],这始终是正确的。
发布于 2020-06-01 12:27:34
只需使用带有浮点算术支持的shell,如zsh (您已经在编写zsh语法,而不是引用您的$((dl))),而不是bash,然后做:
downloadspeed=800.00
if ((downloadspeed < 500))
then
echo "slow - send slow message"
else
echo "fast - no issue"
fi对于不支持浮点算法的bash或POSIX sh语法,您可以调用awk进行比较:
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"
fiPOSIXLY_CORRECT=1有助于防止您的awk是GNU实现,从而使它识别更多的数字形式(如infinity、0x10、0x1p4.YMMV和其他实现)。--帮助使用较早版本的busybox awk,否则它会将负数视为选项。0+将强制在诸如compare '8 apples' '<' '10 bananas'这样的事情上进行数值比较(在这种情况下,后面的文本被忽略了),而不是诉诸字符串比较。
https://unix.stackexchange.com/questions/590229
复制相似问题