【问题标题】:Escaped quotes in string are re-escaped [duplicate]字符串中的转义引号被重新转义[重复]
【发布时间】:2019-03-17 16:02:12
【问题描述】:

我目前有一个 bash 脚本,我想将要执行的命令与执行本身分开(出于可读性目的):

set -x
MAIN_COMMAND="mysql -u root \"select 1 from dual;\""
...
MAIN_RESULT=$($MAIN_COMMAND 2>&1)

执行命令时,我得到以下调试输出:

++mysql -u root '"select' 1 from 'dual;"'

显然,我转义字符串的方式有问题,但我无法确定。

此外,输出重定向不会连接到主命令。

【问题讨论】:

  • @tripleee:我在一个变量中搜索涉及mysql 的完全相同的副本。觉得有用。
  • cmd=(mysql -u root "select 1 from dual;"); result=$( "${cmd[@]}" 2>&1)
  • 您看到的额外引用正是外壳“规范化”其输出的方式。是的,这很难理解问题出在哪里,但是如果您确定在脚本中引用的内容是正确的,那么您可以假设显示的内容是正确的(抱歉,我无法从逻辑上解释它,但是有一个合乎逻辑的解释;-))。为了说服自己是这种情况,请使用set -x active 对命令进行一些试验。祝你好运。
  • @Inian 你的重复标记不包括问题的来源
  • @PaulRM:同意,但上下文是一样的

标签: bash quotes double-quotes quote quoting


【解决方案1】:

好的,试试:

set -x
MAIN_COMMAND="mysql -u root \"select 1 from dual;\""
MAIN_RESULT=$("$MAIN_COMMAND" 2>&1)

但是,这只修复了逃逸部分,

对于完整的结果,我使用类似的东西:

 set -x
 MAIN_COMMAND="MYSQL_PWD=dbpass /usr/bin/mysql -u dbuser dbname <<< \"select 1 from dual;\""
 MAIN_RESULT=$(eval "$MAIN_COMMAND" 2>&1)

【讨论】:

  • 我最终得到:mysql command not found...
  • 是的,这部分是预期的结果。修复完整集 -x MAIN_COMMAND="MYSQL_PWD=dbpass /usr/bin/mysql -u dbuser dbname &1)跨度>
  • 好的,谢谢。它也接近我在这里找到的解决方案:stackoverflow.com/questions/18219262/…
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2013-04-06
  • 2012-05-28
  • 2016-04-19
相关资源
最近更新 更多