【发布时间】:2023-04-11 01:51:01
【问题描述】:
嘿,我是 shell 脚本的新手,我正在尝试编写一些涉及浮点计算的东西。我打算使用 bc 或 awk。
但是,由于我找不到告诉 bc 正确执行 x^(1/3) 的方法,我最终选择了 awk。除了一个问题,我什么都做完了:对于用 awk 进行除法,每当我的除数小于 1 时,比如 0.0064,awk 似乎将其读取为 0。因此我得到了 inf 作为结果。我不确定我哪里做错了。
这是我的代码,我需要将计算的值存储到变量中,不一定要打印出来。
我也很好奇 bc、awk 或 simple expres'' 形式如何处理值?它们是作为数值还是字符串读取/存储?
另外,只是为了使用 awk 作为计算,我可以做 x=$(echo "expression" | awk) 或类似的东西,而不使用 awk '{ }' 中的 print 表达式吗?
#!/bin/bash
# molar concentration = 0.1 mM per nm^3
MOLAR=0.0001
NA=6.02*10^23
CONV=1*10^24
number_concentration=$(echo "scale=10;$MOLAR * $NA / ($CONV)" | bc)
echo $number_concentration
# determine box size
volume=$(awk 'BEGIN {print 1+$number_concentration}' /dev/null)
echo $volume
# length
a=$(echo awk 'BEGIN {$volume^(1/3)}' /dev/null)
【问题讨论】:
-
shell sn-p 无法正常工作,因为您的变量根本没有在 awk 脚本中使用。您将脚本放在单引号中,因此 shell 不会扩展您的变量值。我会使用 awk 的
-v参数将值传递给 awk。 -
我使用了双引号,它有效!谢谢!
-
0.0064小于0? -
wrt
I used the double quotes and it works!- 这是一个糟糕的主意,因为它会导致在你的 awk 脚本中引用和逃避地狱。不要这样做,因为它完全没有必要。 -
嘿,Ed,您能详细说明一下您的 cmets 吗?对不起,我对脚本很陌生,所以我不太明白你的意思。