2

问题:

以下 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

4 回答 4

7

因为$TARG_DB在子shell 内的单引号内,所以按字面意思理解。在那里使用双引号,它们不会弄乱子shell。例如

$ 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
于 2012-02-01T15:52:28.547 回答
2

不要用单引号括起来。

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

DB_CREATE=$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse "create database $TARG_DB");
于 2012-02-01T15:52:29.167 回答
0
TARG_DB="zztest";
DB_CREATE="$(${MYSQL} -u ${MyUSER} -h ${MyHOST} -p${MyPASS} -Bse \"create database ${TARG_DB}\")";
于 2012-02-01T15:51:49.040 回答
0

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

于 2012-02-01T15:55:13.567 回答