【问题标题】:mysql query inside escaped bash -c string. How to put quotes?mysql 在转义的 bash -c 字符串中查询。如何放引号?
【发布时间】:2023-12-22 20:36:01
【问题描述】:

您好,我在 bash 脚本中的特定行遇到问题。 这是代码:

ssh $SOURCEIP  "/usr/bin/time -f \"%e\" bash -c \"seq $ITER | parallel -n0 \"mysql --silent -h $TARGET -uroot -ppass -e 'SELECT * FROM dbname.tablename WHERE size = $SIZE;' >> out.txt\""

问题是我的引号用完了。 “mysql”开头的开头和转义双引号正在关闭“bash -c”中的双引号。我必须将 mysql 语句放在双引号中,将查询放在单引号中,否则我会收到错误并且我无法弄清楚如何继续。我知道我不应该这样传递密码,并且稍后会更改密码,每次测试时我都会收到此警告“$ITER”,因为--silent 不会抑制这一点。 有问题的代码是一个小 shell 脚本的一部分,它应该只是执行这个数据传输。 由于与其他脚本的一致性,我想先使用 ssh 而不是通过并行更改到另一台机器。

所以基本上我需要在 bash -c 命令周围加上双引号才能使整个并行操作正常工作,由于打开的 ssh 双引号已经转义了,而且我还需要将 mysql 命令放在引号内,但是它们以某种方式相互关闭。

任何帮助将不胜感激。 提前致谢。 拉吉奥

编辑:(解决方案) 正如@ole-tange 所建议的,以下命令对我有用。

parallel --shellquote | parallel --shellquote

在 shell 中调用后,我将有问题的字符串粘贴到提示符中并取回被屏蔽的字符串。我仍然很难找出究竟要粘贴什么,但最终它只是合乎逻辑的。 我粘贴到引用器中的确切内容是:

sql mysql://root:pass@$TARGET/ 'SELECT data FROM db_name.tablename WHERE size = ${SIZE};' >> out.txt

但我的查询中的变量仍然存在一些问题。这里的问题是,在并行引用器屏蔽了所有内容之后,我必须取消屏蔽 2 个变量 $TARGET 和 $SIZE 的屏蔽。也许我的想法太费力了,但我无法让它以另一种方式工作。另请注意,我没有像以前的计划那样在整个 sql 语句周围加上引号,因为现在引用器对此进行了补偿。出于一致性原因,我粘贴了我最后工作的最终字符串(之后进行了更改):

ssh $SOURCEIP  "/usr/bin/time -f \"%e\" bash -c \"seq $ITER | parallel -n0 sql\\\ mysql://root:pass@$TARGET/ \\\'SELECT\\\ data\\\ FROM\\\ db_name.tablename\\\ WHERE\\\ size\\\ =\\\ ${SIZE}\\\;\\\'\\\ \\\>\\\>\\\ out.txt\""

【问题讨论】:

    标签: mysql bash ubuntu quotes gnu-parallel


    【解决方案1】:

    GNU Parallel 有一个引用器:

    $ parallel --shellquote
    "*\`$
    [CTRL-D]
    \"\*\\\`\$
    

    你可以做两次:

    $ parallel --shellquote | parallel --shellquote
    "*\`$
    [CTRL-D]
    \\\"\\\*\\\\\\\`\\\$
    

    所以只需粘贴你想要引用的字符串。

    但您可能要考虑使用函数并使用env_parallel 来复制函数:

    myfunc() {
      size=$1
      target=$2
    
      sql mysql://root:pass@$target/ "SELECT data FROM db_name.tablename WHERE size = $size;" >>  out.txt
    }
    env_parallel --env myfunc -S $SOURCEIP --nonall myfunc $SIZE $TARGET
    

    另外:代替mysql 试试sql mysql://root:pass@/ 'SELECT * FROM dbname.tablename WHERE size = $SIZE;'

    【讨论】: