“尽管产生浮点数结果。Bash不支持整数以外的其他类型的参数,所以你需要调用外部工具,如bc来进行数学计算,或者只使用整数。”4.5: syntax error: invalid arithmetic operator (error token is ".5") - but the code still seems to work, why?通常我使用bc外部工具来修复它,但现在我有一个函数,我不知道在哪里确切地使用它,你能帮我吗?
#!/bin/bash
function crossProduct {
declare -a v1=("${!1}")
declare -a v2=("${!2}")
#Note: Can't pass by reference, so the global variable must be used
vectResult[0]=$(( (v1[1] * v2[2]) - (v1[2] * v2[1]) ))
vectResult[1]=$(( - ((v1[0] * v2[2]) - (v1[2] * v2[0])) ))
vectResult[2]=$(( (v1[0] * v2[1]) - (v1[1] * v2[0]) ))
}
vect1[0]=0.3
vect1[1]=-0.3
vect1[2]=0.1
vect2[0]=0.4
vect2[1]=0.9
vect2[2]=2.3
crossProduct vect1[@] vect2[@]
echo ${vectResult[0]} ${vectResult[1]} ${vectResult[2]}
发布于 2020-05-05 18:55:39
您可以传递引用,即作为local -n arr=$1
$ function _tmp {
local -n arr=$1
for i in ${arr[@]}; do echo $i; done
}
$ TMP=(1 2 3)
$ _tmp TMP
1
2
3
现在来看bc
问题;它解析一个字符串并返回它的值。因此,您应该将其用作:
# make sure you declare vectResult first.
function crossProduct {
declare -a v1=("${!1}")
declare -a v2=("${!2}")
vectResult[0]=$( echo "(${v1[1]} * ${v2[2]}) - (${v1[2]} * ${v2[1]}) " | bc)
vectResult[1]=$( echo "- ((${v1[0]} * ${v2[2]}) - (${v1[2]} * ${v2[0]}))" | bc )
vectResult[2]=$( echo "(${v1[0]} * ${v2[1]}) - (${v1[1]} * ${v2[0]})" | bc )
}
将两者结合起来作为我将如何实现它:
#!/bin/bash
function crossProduct {
local -n v1=$1
local -n v2=$2
local result=()
# You should remain to use bc because Bash only does integers.
result+=($( echo "(${v1[1]} * ${v2[2]}) - (${v1[2]} * ${v2[1]}) " | bc))
result+=($( echo "-((${v1[0]} * ${v2[2]}) - (${v1[2]} * ${v2[0]}))" | bc ))
result+=($( echo "(${v1[0]} * ${v2[1]}) - (${v1[1]} * ${v2[0]})" | bc ))
echo "${result[@]}"
}
vect1[0]=0.3
vect1[1]=-0.3
vect1[2]=0.1
vect2[0]=0.4
vect2[1]=0.9
vect2[2]=2.3
vectResult=($(crossProduct vect1 vect2))
echo ${vectResult[0]} ${vectResult[1]} ${vectResult[2]}
exit 0
这将生成-.6 -.6 .3
https://stackoverflow.com/questions/61611252
复制相似问题