如何在Bash中打印用户输入的平方根?

5

我最近在bash中发现了'bc',并尝试使用它来打印用户输入的平方根。我编写的程序成功运行,但只打印出'0'而不是用户输入的平方根。

下面是我编写的代码:

 #!/data/data/com.termux/files/usr/bin/bash

 echo "input value below"
 read VAR
 echo "square root of $VAR is..."

 echo $((a))                                  
 a=$(bc <<< "scale=0; sqrt(($VAR))")

我的代码有什么问题?我漏掉了什么吗?

2
使用 [ shellcheck ] 来检测脚本问题。 - sjsam
4个回答

8
您的bc命令和使用命令替代是正确的,问题在于您之前提供了echo $a,但此时它未设置。请执行以下操作:
a=$(bc <<< "scale=0; sqrt($VAR)")
echo "$a"

在扩展变量时,您应该使用通常的变量扩展符号,即$var${var}。此外,我已经从sqrt()中删除了一对冗余的()标记。

另外,read -p "input value below" varVAR->var。在 shell 脚本中使用全大写变量是不被鼓励的。 - sjsam
由于用户输入不可信,您需要在将其传递给 bc 之前检查它是否为数字。您可以使用 if [ "$var" -eq "$var" ] 2>/dev/null;then a=$(bc <<< "scale=0; sqrt($var)") else echo "$var not number"; fi 这个概念,我从 [这里] 借鉴了这个概念。 - sjsam

2

您可以使用 awk 命令来实现。例如,以下示例显示 98 的平方根的 30 个小数位:

Original Answer 翻译成“最初的回答”。

awk "BEGIN {printf \"%.30f\n\", sqrt(98)}"

上面的命令将输出9.899494936611665352188538236078,然后您可以将其存储到 a 变量中。最初的回答。

2

如果你有一个变量var里面存储了一个数字,而你想要计算这个数字的平方根,你可以使用awk命令:

a=$(awk -v x=$var 'BEGIN{print sqrt(x)}')

或者

a=$(echo "$var" | awk '{print sqrt($1)}')

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接