"b c" внешний инструмент в функцию - PullRequest
1 голос
/ 05 мая 2020

«Несмотря на получение результатов с плавающей запятой. Bash не поддерживает другие типы аргументов, кроме целых чисел, поэтому вам нужно скорее вызывать внешние инструменты, такие как b c, для ваших математических вычислений или придерживаться только целых чисел». 4.5: синтаксическая ошибка: недопустимый оператор arithmeti c (токен ошибки «.5») - но код все еще работает, почему? Обычно я использую внешний инструмент b c, чтобы исправить это , но теперь у меня есть функция и я не знаю, где именно ее использовать, вы можете мне помочь?

    #!/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]}

1 Ответ

2 голосов
/ 05 мая 2020

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

...