【问题标题】:Bash + MySQL -d backtick issueBash + MySQL -d 反引号问题
【发布时间】:2013-04-15 14:07:14
【问题描述】:

我正在帮助创建一个社区项目的解决方案,以社区精神免费监测河流水位。这项工作的最终产品将是一个系统,该系统从河流水位探测器中获取数据,并为在线社区生成图表。

我是该项目的早期,并且由于我熟悉 Bash,因此我正在使用它从包含数据的探测器中获取一个文本文件并将其推送到 MySQL 数据库中。一切都很顺利,直到我遇到了一个绊脚石。我的许多数据库表列都是数字,因此必须使用 MySQL 命令行工具与这些列进行交互。不幸的是,我想从 MySQL 语句中获取输出并将其放入一个变量中,但我认为由于两组反引号,MySQL 没有得到正确的命令。

我已经用一个像这样的讨厌的工作来捏造它,这一切都是低效的:

mysql -N -D $targetDatabase -e "select \`"$timeSample"\` from RiverDataDays where date="$dateOfFile";" >tmpValue

dbEntry=`cat tmpValue`

echo $dbEntry

但实际上,我想做的是将它直接推入这样的变量中:

dbEntry=`mysql -N -D $targetDatabase -e "select \`"$timeSample"\` from RiverDataDays where date="$dateOfFile";"`

echo $dbEntry

【问题讨论】:

  • 引号内的反引号前的反斜杠不起作用?而且你不应该逃避第一个反引号。

标签: mysql bash


【解决方案1】:

尝试这样做:

dbEntry="$(printf "SELECT \140%s\140 FROM 'RiverDataDays' WHERE date = '%s';\n" "$timeSample" "$(<tmpValue )" | mysql -N -D "$targetDatabase")"
echo "$dbEntry"

dbEntry="$(printf "SELECT \`%s\` FROM 'RiverDataDays' WHERE date = '%s';\n" "$timeSample" "$(<tmpValue )" | mysql -N -D "$targetDatabase")"
echo "$dbEntry"

反引号(`)用于旧式命令替换,例如

foo=`command`

foo=$(command)
建议使用

语法。 $() 中的反斜杠处理不那么令人惊讶,并且 $() 更容易嵌套。见http://mywiki.wooledge.org/BashFAQ/082


\140

是反引号的八进制表示,请参阅

man ascii

【讨论】:

  • Sputnick - 非常感谢你 :) 老实说,你的语法让我有点不知所措(我今天要标记了!),但阅读这篇文章后,我清楚地知道了使用反引号的问题。通过将上述语句包含在 $() 中,我的问题得到了解决,因为我相信语法在 $() 内被扩展和执行。
  • 我认为您确实为我指明了正确的方向 - 实际答案是这样的:-
  • dbEntry=$(mysql -N -D $targetDatabase -e "select `"$timeSample"` from RiverDataDays where date="$dateOfFile";")
  • 再次感谢您的时间和精力 - 谢谢您的好心先生 :)
【解决方案2】:

关注斯普特尼克的链接:- http://mywiki.wooledge.org/BashFAQ/082

然后相应地修改代码

dbEntry=$(mysql -N -D $targetDatabase -e "select \`"$timeSample"\` from RiverDataDays where date="$dateOfFile";")

回显 $dbEntry

精彩的论坛 - 非常感谢 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多