当用户插入f(x)时,我试图在for循环中运行f(x)。例如,f(x)=(x^2-4)/(x-2)。当我在循环中输入完整的f(x)时,它工作了。但是,当我尝试使用变量时,它不起作用。
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
发布于 2020-12-19 13:19:02
您将希望用户提供包含数学变量(而不是bash
变量)的表达式,然后构造一个bc
命令,该命令将根据bash变量对这些数学变量进行赋值,然后计算函数:
F='(x^2-4)/(x-2)'
for X in 3 4; do
echo "x=$X; $F" | bc
done
你可以在这里试试。
在您的代码中,函数变量不能工作,因为您用单引号来定义它,这意味着bash
变量没有展开,bc
接收的是$X
而不是它的值。
使用双引号可能有效,但它需要在函数之前定义bash
变量。
此外,扩展包含bash变量的用户提供的函数将需要使用eval
或类似的技巧来评估任意用户提供的代码,这些代码可能会对安全构成威胁。
发布于 2020-12-19 13:17:46
bash只应用一个变量展开传递,因此X必须在子shell中展开。可以这样做:
F='(${X}^2-4)/(${X}-2)'
for X in 3 4; do
(
echo "X=${X}"
echo 'echo "'"${F}"'"|bc'
)|
bash
done
当然,将不受信任的代码传递到shell的安全性考虑(正如注释中所表示的那样)是适用的。我的例子还没有被正确引用F的任意值,而应该被看作是如何使用shell来完成它的草图。
https://stackoverflow.com/questions/65370068
复制相似问题