linux - 如何在带双引号的ssh命令中处理单引号

标签 linux bash shell unix ksh

我有一个需要在当前和远程服务器中使用单引号的参数的要求,如下所示

var1=$2
var2=`echo $var1|sed -r "s/'/\\\\\'/g"`
echo "echo \\\"$var2\\\" && ssh id@server \\\" echo \\\"$var2\\\" \\\" " > sql1.txt
xargs --arg-file=sql1.txt --max-procs=$1 --replace --verbose /bin/sh -c "{}"

转义引号后,该参数在当前服务器中完美填充,但在远程服务器上未显示单引号。
ksh script.ksh 2 "tablename where last_load_dt = '2020-06-19'"

输出
/bin/sh -c echo "tablename where last_load_dt = '2020-06-19'" && ssh id@server "echo "tablename where last_load_dt = '2020-06-19'" "
tablename where last_load_dt = '2020-06-19'
---ssh to remote server---
tablename where last_load_dt = 2020-06-19 

如何在远程服务器中正确填充单引号?

最佳答案

如果可以使用bash(您已将其作为标签放置),则这是一种解决方案:

printf "%s\0" "echo \"$2\" && ssh id@server echo \"${2@Q}\"" > sql1.txt
xargs -0 --arg-file=sql1.txt --max-procs=$1 --replace --verbose /bin/sh -c "{}"

$ {2 @ Q}用于正确地转义单引号。

同样,xargs -0防止双引号被删除。

调用方式:
bash script.bash 2 "tablename where last_load_dt = '2020-06-19'"

关于linux - 如何在带双引号的ssh命令中处理单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62476431/

相关文章:

linux - 我如何使用正则表达式获取文件的特定字符串

bash - 从 MediaInfo 获取视频信息

ruby - Capistrano deploy.rb 文件中的任务问题

BASH/命令行字节数

linux - 删除vim文件中的一些字符

git - Hook /接收后 : Syntax error: "(" unexpected (expecting "done")

php - 使用互斥体的 Linux 并发脚本

bash ps1 仅在新终端窗口上执行一次脚本

c - 为什么代码在 Solaris 上可以运行,但在 Linux 上却不行?

asp.net - 在 Linux 上运行 ASP.Net 与标准的以 Microsoft 为中心的解决方案相比如何?