2012-03-01 34 views
11

我有困难嵌套报价bash脚本中猛砸嵌套的报价和eval

argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 
eval $argv 

上面让我

eval: line 162: unexpected EOF while looking for matching `'' 
eval: line 163: syntax error: unexpected end of file 

回答

12
argv="su -c \"$RVM_PATH wrapper $config_rvm \\\"$PASSENGER_RVM_BIN $command $options\\\"\" web" 
6

Use an array instead.

#!/bin/bash 
cmd=(echo "foo bar") 
"${cmd[@]}" 
+0

我不确定您提供的链接是否讨论了您对bash数组的使用建议。 – 2016-02-15 03:49:48

+0

@TomHale:我的答案有一个语法错误。 – 2016-09-13 04:00:39

9

这是因为\'没有按”在单引号字符串中没有任何特殊含义;它意味着简单的“反斜杠,然后是字符串结尾”。

一种选择是使用$'...'代替'...';这将让你使用反斜杠转义。它应该是这样的:

argv="su -c $'$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 

缺点是,如果有任何机会,$RVM_PATH$config_rvm,或任何其他变量可以包括一个反斜杠,那么它也可以解释为引入一个反斜杠转义。