尝试使用awk sqrt但仅返回0

时间:2016-07-25 18:45:16

标签: unix awk sqrt

我试图在我的脚本中使用来自awk命令的sqrt函数,但它返回的是0.我的脚本下面有什么问题吗?

.sidenav-nav {
    height: 100%;
}

#logout {
    position: absolute;
    bottom: 1em;
}

这是我第一次使用awk命令,是否有任何我不理解的错误?

3 个答案:

答案 0 :(得分:2)

也许你可以试试这个。

echo "enter number"
read root
echo "$root" | awk '{print sqrt($0)}'

您必须向awk提供数据输入。所以,你可以管道回声#39; BEGIN语句是做事情,比如打印标题......等 awk开始阅读输入。

答案 1 :(得分:2)

$ echo "enter number"
enter number
$ read root
3
$ awk -v root="$root" 'BEGIN{ print sqrt(root) }'
1.73205

有关将shell变量的值传递给awk脚本的两种正确方法,请参阅the comp.unix.shell FAQ

答案 2 :(得分:1)

更新:我提出的解决方案结果证明是有潜在危险的。请参阅Ed Morton's answer以获得更好的解决方案。我会在此留下此答案作为警告。

由于单引号,$root由awk解释,而不是由shell解释。 awk将root视为未初始化的变量,其值为空字符串,在数字上下文中视为0$root是当前行的root'字段 - 在本例中为$0,即整行。由于它位于BEGIN块中,因此没有当前行,因此$root是空字符串 - 在传递给{{1}时再次被视为0 }。

您可以通过更改命令行来看到这一点:

sqrt()

注意:以上仅仅是为了说明原始命令的错误,以及shell和awk如何解释它。

一种解决方案是使用双引号而不是单引号。 shell在双引号内扩展变量引用:

$ awk 'BEGIN { print sqrt("") }'
0
$ echo 2 | awk '{ print sqrt($root) }'
1.41421

做这种事情时你需要小心。 shell与awk中的引用和变量扩展之间的相互作用可能很复杂。

更新:实际上,您需要非常非常。正如Ed Morton在评论中指出的那样,这种方法可能导致任意代码执行,因为$ echo "enter number" enter number $ read x 2 $ awk "BEGIN { print sqrt($x) }" # DANGEROUS 1.41421 具有恶意值,这始终是从用户输入读取值的风险。 His answer避免了这个问题。

(请注意,我已将shell变量的名称从$x更改为$root,因为它是您想要的平方根的数字,而不是根本身。 )