首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在用户输入的循环中运行f(x)

如何在用户输入的循环中运行f(x)
EN

Stack Overflow用户
提问于 2020-12-19 12:58:44
回答 2查看 76关注 0票数 0

当用户插入f(x)时,我试图在for循环中运行f(x)。例如,f(x)=(x^2-4)/(x-2)。当我在循环中输入完整的f(x)时,它工作了。但是,当我尝试使用变量时,它不起作用。

代码语言:javascript
运行
复制
F='(${X}^2-4)/(${X}-2)'
for X in 3 4; do
    echo "${F}" | bc # this doesn't work
    echo "(${X}^2-4)/(${X}-2)" | bc # this one works
done
exit 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-19 13:19:02

您将希望用户提供包含数学变量(而不是bash变量)的表达式,然后构造一个bc命令,该命令将根据bash变量对这些数学变量进行赋值,然后计算函数:

代码语言:javascript
运行
复制
F='(x^2-4)/(x-2)'
for X in 3 4; do
    echo "x=$X; $F" | bc
done

你可以在这里试试

在您的代码中,函数变量不能工作,因为您用单引号来定义它,这意味着bash变量没有展开,bc接收的是$X而不是它的值。

使用双引号可能有效,但它需要在函数之前定义bash变量。

此外,扩展包含bash变量的用户提供的函数将需要使用eval或类似的技巧来评估任意用户提供的代码,这些代码可能会对安全构成威胁。

票数 2
EN

Stack Overflow用户

发布于 2020-12-19 13:17:46

bash只应用一个变量展开传递,因此X必须在子shell中展开。可以这样做:

代码语言:javascript
运行
复制
F='(${X}^2-4)/(${X}-2)'
for X in 3 4; do
    (
        echo "X=${X}"
        echo 'echo "'"${F}"'"|bc'
    )|
    bash
done

当然,将不受信任的代码传递到shell的安全性考虑(正如注释中所表示的那样)是适用的。我的例子还没有被正确引用F的任意值,而应该被看作是如何使用shell来完成它的草图。

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

https://stackoverflow.com/questions/65370068

复制
相关文章

相似问题

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