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

发布于 2025-01-01 14:19:56 字数 481 浏览 0 评论 0原文

问题:

以下 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 为插值或扩展,给出预期 结果?

Problem:

The following shell script code does not produce the expected result:

# 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')";

Expected outcome:

A new database created with the name zztest

Actual outcome:

A new database created with the name $TARG_DB

Question:

How can this example code be changed such that $TARG_DB is interpolated or expanded, giving the expected outcome?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

遗忘曾经 2025-01-08 14:19:56

因为 $TARG_DB 在子 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

Because $TARG_DB is within single quotes within the subshell, it's taken literally. Use double quotes there, they won't mess up the subshell. 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
我是男神闪亮亮 2025-01-08 14:19:56

不要将其用单引号引起来。

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

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

Don't wrap it in single-quotes.

There is no need to quote the command substitution $() so you can remove those and use double-quotes inside it.

DB_CREATE=$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse "create database $TARG_DB");
ㄟ。诗瑗 2025-01-08 14:19:56
TARG_DB="zztest";
DB_CREATE="$(${MYSQL} -u ${MyUSER} -h ${MyHOST} -p${MyPASS} -Bse \"create database ${TARG_DB}\")";
TARG_DB="zztest";
DB_CREATE="$(${MYSQL} -u ${MyUSER} -h ${MyHOST} -p${MyPASS} -Bse \"create database ${TARG_DB}\")";
墨落画卷 2025-01-08 14:19:56

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

The 'create database $TARG_DB' part is wrong! Single quotes supress variable substitution in bash. MySQL "sees" the literal text "$TARG_DB" and creates a database with that name. Put your sql statement in double quotes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文