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
您好,我在处理 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