在进行服务器维护时,我经常发现自己编写了多级嵌套的命令,例如:
for server in A B C; do sh -c "ssh $server 'mysql db -e \"select where line like \\\"%abc%\\\"\"'&"; done
这可能是一个牵强的例子,但这确实是我有时为了完成一些奇怪的、临时的任务必须做的事情。
问题在于引号。随着您进入更深层次,您必须开始转义引号、转义美元符号和转义转义。使用单引号有助于避免一级,但仅此而已。
我开始为自己寻找解决方案,受到 perl 中的 qq() 函数的启发,但我想先问问:是否有一种工具、方法或框架可以更容易地编写这些嵌套命令而不会被反斜杠所困扰?
答案1
您可以通过 stdin 而不是通过 argv 传递 mysql 命令来避免大多数引用层:
for server in A B C; do
ssh "$server" 'mysql db' <<< "select * from foo where line like '%abc%';" &
done
wait
有关更通用的答案,请参见http://mywiki.wooledge.org/BashFAQ/096
答案2
尝试这个:
echo "ssh $server 'mysql db....'" | sh
它减少了嵌套级别,也使它变得更容易,因为您只需运行 echo 命令,直到获得所有转义后想要运行的确切命令。