Как обрабатывать одинарные кавычки внутри команды s sh с двойными кавычками - PullRequest
2 голосов
/ 19 июня 2020

У меня есть требование, когда мне нужно использовать аргумент с одинарными кавычками на текущем и удаленном сервере, например, как показано ниже

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 

Как правильно заполнить одинарные кавычки на удаленном сервере?

1 Ответ

1 голос
/ 19 июня 2020

Если можно использовать 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'"
...