我根本不明白
命令行(有效):
$ someprog -flag 'key1=val 1,key2=val 2,key3=val 3'
sh 直接(有效):
#!/bin/sh
someprog -flag 'key1=val 1,key2=val 2,key3=val 3'
sh 变量(失败):
#!/bin/sh
OPTSTR="'key1=val 1,key2=val 2,key3=val 3'"
someprog -flag "$OPTSTR" #fails
someprog -flag ${OPTSTR} #fails
someprog -flag $OPTSTR #fails
eval "someprog -flag $OPTSTR" #works
答案1
在前两个例子中,你引用了你的论点。这些引号只能被您的 shell 看到,它会将整个字符串视为单个参数,而不是将其拆分为空格。程序看不到引号本身。
键入OPTSTR="'key1=val 1,key2=val 2,key3=val 3'"
变量的内容时包含单引号,因此稍后将提供给您的程序。您的程序看到了引号,但没有预料到它们,因此失败了。
只需使用:
OPTSTR="key1=val 1,key2=val 2,key3=val 3"
someprog -flag "$OPTSTR"
单引号和双引号之间的区别在于,您是否希望 shell 替换变量等。