bash 中带有嵌入引号的字符串扩展
问题:
以下 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
因为
$TARG_DB
在子 shell 中的单引号内,所以它是按字面意思理解的。在那里使用双引号,它们不会弄乱子外壳。例如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.不要将其用单引号引起来。
无需引用命令替换
$()
,因此您可以删除它们并在其中使用双引号。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.'创建数据库 $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.