2012-02-01 64 views
2

问题:字符串扩张与嵌入式引号

下面的脚本代码不会产生预期的结果:

# MYSQL, MyUSER MyHost etc ... all defined above as normal 

TARG_DB="zztest"; 
DB_CREATE="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'create database $TARG_DB')"; 

预期成果:

创建一个新的数据库与名字zztest

实际结果:

的名称创建一个新的数据库$TARG_DB

问:

怎么能这个例子的代码被改变,使得$TARG_DB插值或扩展,给出预期的结果?

回答

6

由于$TARG_DB位于子shell中的单引号内,因此从字面上理解。在那里使用双引号,他们不会搞乱subshel​​l。例如

$ tmp="a b c" 
$ echo $tmp 
a b c 
$ echo $(echo $tmp) 
a b c 
$ echo $(echo "$tmp") 
a b c 
$ echo $(echo '$tmp') 
$tmp 
$ echo "$(echo '$tmp')" 
$tmp 
$ echo "$(echo "$tmp")" 
a b c 
+0

伟大的答案,直接:用例子。谢谢。 – dreftymac 2012-02-02 16:18:33

+0

顺便说一句,堆栈溢出误解了引号(使答案具有误导性),而一个体面的编辑器知道命令替换并正确突出显示它。 – Cuadue 2015-02-03 17:46:46

0
TARG_DB="zztest"; 
DB_CREATE="$(${MYSQL} -u ${MyUSER} -h ${MyHOST} -p${MyPASS} -Bse \"create database ${TARG_DB}\")"; 
+1

因为它位于子外壳内,所以甚至不需要转义引号。 – Kevin 2012-02-01 15:53:08

+0

@凯文谢谢你是对的。 – sgibb 2012-02-01 15:55:38

2

不要用单引号括起来。

没有必要引用命令替换$(),因此您可以删除它们并在其中使用双引号。

DB_CREATE=$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse "create database $TARG_DB"); 
0

'create database $TARG_DB'部分是错误的!单引号在bash中压缩变量替换。 MySQL“看到”文本“$ TARG_DB”并创建一个具有该名称的数据库。把你的sql语句放在双引号中。