问题:
以下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
,从而产生预期结果?
答案 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语句放在双引号中。