在 sh 脚本中传递带引号的字符串参数

在 sh 脚本中传递带引号的字符串参数

我根本不明白

命令行(有效):

$ 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 替换变量等。

相关内容