Bash 带空格的shell脚本传递参数

Bash 带空格的shell脚本传递参数,bash,shell,parameters,space,Bash,Shell,Parameters,Space,我有以下脚本(示例): 当我现在用test.sh-a“here is a string”调用这个脚本时,输出是:a指定为:here,但不是,我希望a指定为:here is a string 我知道我可以用test.sh-a here\is\a\string或test.sh-a“here\is\a\string”调用脚本,它会工作的。但是在我的情况下,我不能操纵我想要传递的字符串。 那么,如何更改我的getopts函数以使其工作 我也尝试了getopt,但我做了更多的工作: commandsSho

我有以下脚本(示例):

当我现在用
test.sh-a“here is a string”
调用这个脚本时,输出是:
a指定为:here
,但不是,我希望
a指定为:here is a string

我知道我可以用
test.sh-a here\is\a\string
test.sh-a“here\is\a\string”
调用脚本,它会工作的。但是在我的情况下,我不能操纵我想要传递的字符串。
那么,如何更改我的
getopts
函数以使其工作

我也尝试了
getopt
,但我做了更多的工作:

commandsShort="a:"
commandsLong="aval:"
TEMP=`getopt \
        -o $commandsShort \
        -l $commandsLong \
        -q \
        -n "$0" -- "$@"`

我做错了什么?

在对您的问题的评论中,这个问题得到了解决。:-)

您正在使用以下命令调用脚本:

eval "test.sh $@"
如果您选择“here is a string”,则此“eval”行的作用是创建引号中的命令行:

test.sh here is a string
并对其进行评估

根据附加注释,如果您可以避免评估,您应该

也就是说,如果需要,可以在eval中引用字符串:

eval "test.sh \"$@\""
或者,如果您不喜欢转义引号,请使用单引号,因为由于外部引号为双引号,
$@
将展开:

eval "test.sh '$@'"
最后,正如您在评论中提到的,直接运行可能是最好的选择:

test.sh "$@"
注意如果您的
$@
包含
-a
选项,您可能会遇到新问题。考虑命令行:

test.sh "-a here is a string"

在本例中,您的整个字符串(以
-a
开头)位于
$1
中,您将没有getopts选项,也没有OPTARG。

您声称拥有的输出不是我得到的;对我来说,输出是你想要得到的。您到底是如何调用test.sh的?我想不是直接从外壳上取的吧?我怀疑你可能会用某种方式来称呼它,从而去掉了引用。@ghoti我很抱歉。。。问题确实在于将命令传递给另一个脚本,该脚本的内容为
eval“test.sh$@”
。如何以正确的方式将所有参数传递给
test.sh
,使结果与直接调用
test.sh
相同?(
$*
也将不起作用…@christopher2007为什么使用eval?@123好问题^^我将其更改为普通发票
test.sh“$@”
,现在它起作用了。谢谢。
test.sh "-a here is a string"