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"