您好我在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命令放在引号内但是它们正在以某种方式相互关闭。
任何帮助将不胜感激。 提前致谢。 Largio
编辑:(解决方案) 正如@ 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\""
答案 0 :(得分:0)
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;'