Linux bc未通过脚本执行

Linux bc未通过脚本执行,linux,bash,standard-deviation,bc,Linux,Bash,Standard Deviation,Bc,嗨,我有一个脚本,我用它来计算从服务器返回的一组值的标准偏差 我可以很容易地检索命令并使用该命令构建有效字符串 bc <<< "scale=10; sqrt((0+((782636-782030)^2)+((781460-782030)^2)+((782492-782030)^2)+((781704-782030)^2)+((781860-782030)^2))/5)" 然而,我得到的输出 File <<< is unavailable. 文件请尝试: e

嗨,我有一个脚本,我用它来计算从服务器返回的一组值的标准偏差

我可以很容易地检索命令并使用该命令构建有效字符串

bc <<< "scale=10; sqrt((0+((782636-782030)^2)+((781460-782030)^2)+((782492-782030)^2)+((781704-782030)^2)+((781860-782030)^2))/5)"
然而,我得到的输出

File <<< is unavailable.
文件请尝试:

echo "scale=10; sqrt((0+((782636-782030)^2)+((781460-782030)^2)+((782492-782030)^2)+((781704-782030)^2)+((781860-782030)^2))/5)" | bc -l 
i、 e.
echo
您的字符串并通过管道将输出传输到
bc-l


这将起作用

您应该在字符串中构建
bc
命令,然后将此字符串传递给
bc

如果我理解正确,您有一个数字数组
memory
1和一个变量
mean
,您想计算
memory
的标准偏差(我想,
mean
memory
的平均值)

您需要建立以下格式的字符串:
(X-mean)^2

sum_terms=0
for i in "${memory[@]}"; do
    sum_terms+="+(($i)-($mean))^2"
done
此时,字符串
sum_terms
包含扩展为以下内容的字符串:

0+((m1)-(mean))^2+((m2)-(mean))^2+ ... +((mn)-(mean))^2
最后,您希望将其括在括号中,在
sqrt(
之前加上
/5)
并将其传递给
bc

bc <<< "sqrt(($sum_terms)/5)"

事实上,您并不真正需要显式的
for
循环,您可以离开
printf
为您完成以下工作:

memory=( 782636 781460 782492 781704 781860 )
printf -v sum_mem '+(%s)' "${memory[@]}"
printf -v sum_memsq '+(%s)^2' "${memory[@]}"
mean=$(bc -l <<< "(0$sum_mem)/${#memory[@]}")
bc -l <<< "sqrt((0$sum_memsq)/${#memory[@]}-($mean)^2)"
memory=(782636 781460 782492 781704 781860)
printf-v sum_mem'+(%s)“${memory[@]}”
printf-v sum_memsq'+(%s)^2'${memory[@]}”

mean=$(bc-l您还应该在
bc
中直接定义标准偏差函数,而不是在
bash
中构建一个长表达式作为程序传递。
sum_terms=0
for i in "${memory[@]}"; do
    sum_terms+="+(($i)-($mean))^2"
done
0+((m1)-(mean))^2+((m2)-(mean))^2+ ... +((mn)-(mean))^2
bc <<< "sqrt(($sum_terms)/5)"
sum_terms=0
for i in "${memory[@]}"; do
    sum_terms+="+(($i)-($mean))^2"
done
bc -l <<< "sqrt(($sum_terms)/5)"
memory=( 782636 781460 782492 781704 781860 )
sum_mem=0 sum_memsq=0
for i in "${memory[@]}"; do
    sum_mem+="+($i)"
    sum_memsq+="+($i)^2"
done
mean=$(bc -l <<< "($sum_mem)/${#memory[@]}")
bc -l <<< "sqrt(($sum_memsq)/${#memory[@]}-($mean)^2)"
memory=( 782636 781460 782492 781704 781860 )
printf -v sum_mem '+(%s)' "${memory[@]}"
printf -v sum_memsq '+(%s)^2' "${memory[@]}"
mean=$(bc -l <<< "(0$sum_mem)/${#memory[@]}")
bc -l <<< "sqrt((0$sum_memsq)/${#memory[@]}-($mean)^2)"