如何在 bash 中以用户输入作为操作数调用 Matlab 函数

如何在 bash 中以用户输入作为操作数调用 Matlab 函数

我想使用 bash 运行 matlab,这需要matlab -nodesktop -nosplash -r "functionmat(var1,var2)"调用 a 命令。例如,我可以运行matlab -nodesktop -nosplash -r "functionmat(5,4)" ,如果这是有效的输入,则它可以工作并且创建一些文件并执行mfile其中的任何操作。

但我希望变量成为用户询问的输入,因此每次运行都会有所不同,而无需用户更改脚本。用户只需在询问时输入不同的输入即可。

这不起作用(什么也没有发生):

#!/bin/bash
echo "Please variables 1 and 2:"
read var1 var2

matlab -nodesktop -nosplash -r "functionmat($var1,$var2)"

像这样的调用matlab也不起作用(说这是一个错误,因为它可能在应该有数字时读取字符串类型输入):

matlab -nodesktop -nosplash -r "functionmat('$var1','$var2')"

这也不起作用(什么也没有发生——没有创建文件):

sect1="\""
sect2="functionmat("
sect3=","
sect4=")"
sect5="\""

matlab -nodesktop -nosplash -r "$sect1$sect2$var1$sect3$var2$sect4$sect5"

有人不知道如何让它发挥作用吗?

答案1

您的第一个建议应该可以正常工作。我想唯一的变体是检查您是否正确输入变量(以空格分隔,而不是逗号分隔)。您可以通过稍微修改代码来打印两个变量的值并打印命令matlab而不是执行它来证明代码是正确的:

#!/bin/bash
echo "Please variables 1 and 2:"
read var1 var2
echo "var1=$var1, var2=$var2."
echo matlab -nodesktop -nosplash -r "functionmat($var1,$var2)"

答案2

您的第一种方法几乎是正确的,您所需要做的就是确保变量确实是合法的 Matlab 语法。第二个是错误的,因为在 Matlab 中输入看起来像func('1','5')——字符串作为参数。第三个不执行任何操作,因为该行"func(1,5)"只是一个字符串文字。替换matlabprintf '%s\n'以查看您要传递给其中的内容。

输入验证

使用declare -i var1 var2导致变量被识别为整数,并且在赋值时 bash 将计算 the 的结果指定string-to-assign为 C 样式表达式(并抱怨表达式语法错误)。所以这样做:

  • 使您能够使用类似3*2(eval'ed 6by shell)的表达式
  • 不允许您使用像2.45.
  • 确保传递的数字是整数。
    • 看起来像的结构[[:alpha:]_][[:word:]]*将被识别为 varname,它会被进一步评估,如果未定义,则默认为 0。

当抛出错误时read,整个变量仍未初始化。你可以这样捕捉它:

declare -i var1 var2
until ((${#var1[@]} && ${#var2[@]})); do read -p "INPUT! NOW!" var1 var2; done

自定义扩展通配模式如果你想处理的话可以使用小数点也是(并排除变量处理部分)。请注意,我懒得考虑表达式:

shopt -s extglob # bash 3, regex =~ is bash 4.
until [[ $var1 == +([0-9])?(.*([0-9])) && $var2 == +([0-9])?(.*([0-9])) ]]; do
    read -p "Please input.. " var1 var2
done

您甚至可以进一步允许使用一些您想要使用的 MATLAB 变量,因为通过这种方式,它是在原始字符串中传递的。

read分隔器

只需IFS+=,在 之前添加或任何您希望它成为有效分隔符的内容read


这个答案是对上面两个答案的补充,也可能是上面两个答案的组合。原来是编辑的113859113860。阅读GNU Bash 手册有关详细信息,请参阅第 3.5.3 章(初始化检查)、第 3.5.7 章(IFS)、第 3.5.8.1 章(模式)和第 4.2 章(内置:声明)。

我的计算机上没有 Matlab,因此我使用 GNU Octave 来检查语法检查的有效性。还有在线 Octave 服务供任何想要尝试该语法的人使用。

答案3

如果未键入,Bash 变量将被视为字符串。我首先尝试为您的变量声明一个类型。像这样的事情,

declare -i var1

我并不乐观地认为这种类型声明会为您提供解决方案,但值得一试。

如果不起作用,为什么不将函数的参数更改为字符串而不是数值呢?让您的 mfile 处理到您选择的数字类型的转换。

参考:

答案4

好的,我找到了运行程序的方法

  #!/bin/bash

    echo "Please enter variables 1 and 2:"
    read var1 var2

    declare -i var1
    declare -i var2

    mystring="matlab -nodesktop -nosplash -r \"functionmat($var1,$var2);exit\""
    eval $mystring

如果您回答了,感谢您的帮助

相关内容