2017-01-10 141 views
0

我写了一个bash脚本,它通过名称接受参数并在键值对中读取其值。以下是我如何运行脚本的示例。为bash脚本解析输入参数时带空格的参数

sh test.sh param1='a' param2='b' 

然后我在脚本内引用输入参数,如$ param1和$ param2。以下是我为此撰写的脚本。

for item in [email protected]; do 
case $item in 
(*=*) eval $item;; 
esac 
done 

但是,当参数的值有空格时,它只占用空格之前的部分。

param3='select * from' 

只会将“select”分配给param3而不是整个字符串。我怎样才能做到这一点?任何帮助将非常感激。

编辑:

Inian的回答后

for item in [email protected]; do 
case "$item" in 
(*=*) eval "$item";; 
esac 
done 
+1

你有没有考虑过将它们作为变量传递给它,而不是'param1 ='a'param2 ='b'sh test.sh'?这将使'echo'$ param1“'立即可用而不解析 –

+1

使用$ @或$ *而不用双引号括起来不是一个好主意。如果你的字符串中有特殊字符,比如空白字符和通配符,它​​会变得不合时宜。 – codeforester

回答

3

您可以通过引用"[email protected]"和使用declare代替eval做到这一点:

for item in "[email protected]"; do 
case $item in 
(*=*) declare "$item" ;; 
esac 
done 

但是,现在这是一个bash脚本,所以你必须运行它与bash test.sh而不是sh test.sh

+0

这个伎俩!但正如你在评论中指出的那样,在“sh ”之后和“sh ”之前指定参数之间的区别是什么?对不起,我是新手。 – mayooran

+0

@mayooran:如果你在命令之前指定它们,作为环境变量*由调用shell *进行分配*,所以它们可以直接在脚本中使用,如果你把它们放在后面,它们会被解释为字符串以'$ 1','$ 2'等形式传递给脚本,那么你必须做一些非标准和奇怪的事情来将它们转化为变量赋值,脚本接受参数的正常方式是以标准顺序(例如'sh test.sh val1 val2')的裸空字符串,或者使用'-'选项来指定它们(例如'sh test.st -a val1 -b val2')。 –

+0

@GordonDavisson哦,知道了,谢谢!:) :) – mayooran