mysql 查询内部转义 bash -c 字符串。如何引用?

mysql query inside escaped bash -c string. How to put quotes?

您好,我在处理 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 脚本的一部分,该脚本应该只执行此数据 t运行sfer。 由于与其他脚本的一致性,我想先使用 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\""

GNU Parallel 有一个引用:

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

而且你可以做两次:

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

所以只需粘贴您要引用的字符串即可。

不过你可能要考虑使用函数,使用env_parallel复制函数:

myfunc() {
  size=
  target=

  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

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

而不是 mysql