如何在$()中引用/符号

时间:2013-11-16 23:55:47

标签: bash

假设我有这个简单的bash脚本:

#!/bin/bash

text="3.14159"
echo "$text / 10" | bc -l

打印:

.31415900000000000000

哪个是对的。然后我想把输出放到一个变量中,使用这里的$()语法:Bash: How to invoke command and store the result in a variable?

#!/bin/bash

text="3.14159"
out=$("$text / 10" | bc -l)
echo $out

出了错误:

test.sh: line 4: 3.14159 / 10: No such file or directory

它将分区符号视为目录分隔符。

如何解决?

2 个答案:

答案 0 :(得分:2)

将第4行更改为:

out=$(echo "${text} / 10" | bc -l)

答案 1 :(得分:2)

构造$(xyzzy)(对于任何xyzzy)尝试做的是执行该命令并在调用命令的命令行上提供其标准输出。

由于"$text / 10"不是有效命令,这就是您遇到问题的原因。您应该在括号内的第一个样本中提供整个命令(即包括echo位):

pax> text=3.14159 ; out=$(echo "$text / 10" | bc -l) ; echo $out
.31415900000000000000

还有其他方法可以做到这一点。您可以使用here-string解决方案,例如:

pax> text=3.14159 ; out=$(bc -l <<<"$text / 10") ; echo $out
.31415900000000000000

这与bash here-docs类似,不过它有点受限。它扩展了<<<之后给出的单词,并提供了(带尾随换行符)作为命令的标准输入。

当然,bc不是唯一可以使用的命令。如果像你一样,你已经在思考过多的Forth编程,那么RPN dc计算器也可以派上用场:

pax> text=3.14159 ; out=$(dc <<<"50 k $text 10 / n") ; echo $out | sed 's/0*$//'
.314159

在此示例中,50 k设置精度,$text 10 /计算出公式,n弹出值并打印出来。 sed技巧只是从输出中删除尾随零。