运行test.sh
bash脚本
#!/bin/bash +x
./test.m $*
以下列方式之一调用test.m
GNU Octave可执行脚本:
./test.sh my argument
./test.sh "my argument"
./test.sh 'my argument'
argv()
将始终解析这两个字符串:
ans =
{
[1,1] = my
[2,1] = argument
}
有没有办法在单个参数中获取两个单词,而无需进一步处理结果?或者以不同的方式说,分离字符可以与空白不同吗?
有趣的是,bash本身确实与第一个呼叫和其他两个呼叫有所不同。在后一种情况下$1
会得到两个字,而且只有我的'在第一个。
其次,如果参数在发送到Octave脚本之前存储在变量中,将会如何:
#!/bin/bash +x
a="$@"
./test.m $a
这会得到相同的结果,两个字:
ans =
{
[1,1] = my
[2,1] = argument
}
使用./test.m "$a"
#!/bin/bash +x
a="$@"
./test.m "$a"
将传递一个字符串,包括所有参数:./test.sh "my argument" other
将my argument other
打包在一起:
ans =
{
[1,1] = my argument other
}
答案 0 :(得分:3)
您应该能够使用""
包围字符串,或者在调用八度脚本时使用\
转义空格
./test.m "hello world"
./test.m hello\ world
您遇到的问题是由于您正在从另一个bash脚本中调用您的八度脚本而 bash脚本没有将正确转义的字符串转发到八度调用,因为您只使用了未加引号的$*
。如果您只希望八度音阶脚本只有一个输入,那么您需要将$*
与""
#!bin/bash
./test.m "$*"
并使用以下方式调用它:
./test.sh "hello world"
{
[1,1] = hello world
}
然而,更强大的选项是使用"$@"
,它将适当地转发所有输入并允许您传递多个多字参数
#!/bin/bash
./test.m "$@"
并使用它
./test.sh "hello world" "how are you"
{
[1,1] = hello world
[2,1] = how are you
}
<强>更新强>
正如@Benjamin所提到的那样,如果你想存储输入,你需要将它们存储在一个数组中
a=("$@")
./test.m "${a[@]}"