【问题标题】:"bc" external tool into a function将“bc”外部工具转换为函数
【发布时间】:2020-05-05 10:44:18
【问题描述】:

“尽管会产生浮点结果。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]}

【问题讨论】:

  • $(( anything )) -> $(echo "anything" | bc)

标签: bash bc


【解决方案1】:

你可以传递引用,即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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多