假设我有这个简单的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
它将分区符号视为目录分隔符。
如何解决?
答案 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
技巧只是从输出中删除尾随零。