【发布时间】: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