是否有工具或技巧可以帮助解决引用疯狂的问题?

是否有工具或技巧可以帮助解决引用疯狂的问题?

在进行服务器维护时,我经常发现自己编写了多级嵌套的命令,例如:

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 命令,直到获得所有转义后想要运行的确切命令。

相关内容