Octave的argv解析以空格分隔的参数,如何传递多字参数?

时间:2016-10-31 20:06:32

标签: bash parsing octave argv

运行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" othermy argument other打包在一起:

ans = 
{
  [1,1] = my argument other
}

1 个答案:

答案 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[@]}"