带有嵌入式引号的bash中的字符串扩展

时间:2012-02-01 15:47:24

标签: bash shell expansion subshell

问题:

以下shell脚本代码不会产生预期结果:

# 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,从而产生预期结果?

4 个答案:

答案 0 :(得分:7)

因为$TARG_DB在子shell中的单引号内,所以它是字面上的。在那里使用双引号,它们不会弄乱子shell。 e.g。

$ 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

答案 1 :(得分:2)

请勿将其用单引号括起来。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

'create database $TARG_DB'部分错了!单引号在bash中压制变量替换。 MySQL"看到"文字文字" $ TARG_DB"并创建一个具有该名称的数据库。将您的sql语句放在双引号中。