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)"