我想使用 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)"
只是一个字符串文字。替换matlab
为printf '%s\n'
以查看您要传递给其中的内容。
输入验证
使用declare -i var1 var2
导致变量被识别为整数,并且在赋值时 bash 将计算 the 的结果指定string-to-assign
为 C 样式表达式(并抱怨表达式语法错误)。所以这样做:
- 使您能够使用类似
3*2
(eval'ed6
by 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
。
这个答案是对上面两个答案的补充,也可能是上面两个答案的组合。原来是编辑的113859和113860。阅读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
如果您回答了,感谢您的帮助