首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将"bc“外部工具添加到函数中

将"bc“外部工具添加到函数中
EN

Stack Overflow用户
提问于 2020-05-05 18:44:19
回答 1查看 43关注 0票数 1

“尽管产生浮点数结果。Bash不支持整数以外的其他类型的参数,所以你需要调用外部工具,如bc来进行数学计算,或者只使用整数。”4.5: syntax error: invalid arithmetic operator (error token is ".5") - but the code still seems to work, why?通常我使用bc外部工具来修复它,但现在我有一个函数,我不知道在哪里确切地使用它,你能帮我吗?

代码语言:javascript
运行
复制
    #!/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]}
EN

Stack Overflow用户

回答已采纳

发布于 2020-05-05 18:55:39

您可以传递引用,即作为local -n arr=$1

代码语言:javascript
运行
复制
$ function _tmp {
    local -n arr=$1
    for i in ${arr[@]}; do echo $i; done
}
$ TMP=(1 2 3)
$ _tmp TMP
1
2
3

现在来看bc问题;它解析一个字符串并返回它的值。因此,您应该将其用作:

代码语言:javascript
运行
复制
# 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 )
}

将两者结合起来作为我将如何实现它:

代码语言:javascript
运行
复制
#!/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

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61611252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档