Вы можете передавать ссылки, а именно как 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