【问题标题】:(bash) how can i pass a float varibale to if conditional(bash)如果有条件,我如何将浮点变量传递给
【发布时间】:2018-04-19 05:35:02
【问题描述】:

我正在尝试使用浮点值传递这个组合变量:

j=1
DA1=178.2929838483883283
if (( $(bc <<< "$((DA$j)) > 150") )) && (( $(bc <<< "$((DA$j)) < -150") ))
then
    D="T"
fi

但我明白了:

178.2929838483883283: syntax error: invalid arithmetic operator (error token is ".2929838483883283")

【问题讨论】:

标签: bash variables if-statement


【解决方案1】:

首先,对于x 的所有值,x &gt; 150 &amp;&amp; x &lt; -150 将为 false。

其次,我注意到您的问题中有一个常见模式: 使用带有数字后缀的动态变量名称。 这非常棘手,难以阅读且容易出错, 当存在更好、更简单、更安全的替代方案时:数组。

使用 Bash 数组重写上述代码:

DA=()

j=0
DA[0]=178.2929838483883283
if (( $(bc <<< "${DA[j]} > 150") )) || (( $(bc <<< "${DA[j]} < -150") ))
then
    D="T"
fi

我在条件下将&amp;&amp; 替换为||,以使其有机会成为真实。

【讨论】:

  • 谢谢,但我需要相关的数字计数器
  • @Another.Chemist 我不明白你的意思。
  • 我想评估 $DA$j,而不是评估数组中的值
  • 我可以看到,但为什么呢?从我目前看到的情况来看,您可以更改使用数组的方法。一切都会变得更简单、更干净、更好,没有缺点,那你为什么不去做呢?
【解决方案2】:

此外,您的错误是不言自明的:

178.2929838483883283: syntax error: invalid arithmetic operator \
(error token is ".2929838483883283")

您无法使用((...)) 算术运算符和浮点数进行比较。注意,你的号码:

178.2929838483883283

注意错误:

syntax error: invalid arithmetic operator (error token is ".2929838483883283")

(( ... )) 评估不知道如何处理 ".2929838483883283",因为 bash 中的数学是 整数 数学。

确切的问题是:

$((DA$j))

触发错误:

178.2929838483883283: syntax error: invalid arithmetic operator \
(error token is ".2929838483883283")

在任何东西被传递给bc之前。

要故意违反 BASH FAQ006,您可以创建一个包含组合 DA# 的变量并使用间接访问该值,但这不是推荐的解决方案,例如

#!/bin/bash

j=1
DA1=178.2929838483883283

foo="DA$j"  ## create a variable to allow indirection

if (( $(bc <<< "${!foo} > 150") )) || (( $(bc <<< "${!foo} < -150") ))
then
    D="T"
fi

echo "D=$D"

使用/输出示例

$ bash compare.sh
D=T

【讨论】:

  • 您的选择是将178.2929838483883283 乘以1000 左右,然后在178292150000 之间进行比较,忽略剩余的小数位(或任何您需要的精度)。您可以使用带有子字符串删除的参数扩展来切断尾随.stuff
  • bc 只返回 10 作为布尔语句,所以据我所知,这不是问题。
  • @BenjaminW。抱歉,bc 尝试进行比较,但结果是基数仍然存在。问题一定出在替换上,因为if (( $(bc &lt;&lt;&lt; "178.2929838483883283 &gt; 150") )); then echo "greater"; fi 有效。
  • @DennisWilliamson - 你指的是哪一部分? $((DA$j)) 是错误的原因吗?
  • 我撤回我的反对意见。
猜你喜欢
  • 2015-05-21
  • 1970-01-01
  • 2011-11-23
  • 2018-02-17
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
相关资源
最近更新 更多