我有一个包含以下2个命令的shell脚本:
sedcmd1="sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' /Users/abc/data.xml"
$sedcmd1
当我运行脚本时,我得到以下错误:
sed: 1: "'/<PromptOnUpdate ...": invalid command code '
如果我运行命令而不将其分配给变量,它运行就好了。但是只有当我将它分配给变量并从那里执行它时才会出错。
我需要变量中的命令以满足我的需要,因为我尝试接收命令作为shell脚本的参数。
data.xml的片段:
<?xml version="1.0" ?>
<Settings Version="1.0.0">
<Android>
<PromptOnUpdate>true</PromptOnUpdate>
</Android>
</Settings>
感谢您对此进行调查!
PS:我在Mac OSX Mavericks上
答案 0 :(得分:4)
扩展变量后不会处理引号。您需要使用eval
:
eval "$sedcmd1"
答案 1 :(得分:1)
shell在扩展变量之前处理引号。这意味着变量中的引号没有魔力;他们被视为与任何其他角色一样。
要将复杂命令存储为变量,您需要一个数组:
sedcmd1=(sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' data.xml)
可以执行数组:
${sedcmd1[@]}
如果您不确定是否定义了数组字符,可以使用declare
命令始终查看其中的内容;
declare -p sedcmd1
产生:
declare -a sedcmd1='([0]="sed" [1]="-i" [2]="" [3]="/<PromptOnUpdate>true<\\/PromptOnUpdate>/G" [4]="data.xml")'