首页 > 解决方案 > 如何在 docker postgres 命令中转义引号

问题描述

我正在运行以下命令(重命名了一些变量):

docker exec docker_name sh -c 'psql dbname -U joeadmin -c "update table set field='really_longstringwithabunf3493829#@#@#@#@#=';"'

当我运行它时,它会抛出以下错误:

ERROR:  syntax error at or near ";"
LINE 1: ...longstringwithabunf3493829#@#@#@#@#=;
                                               ^

我怎样才能转义或保留单引号,这样才能正常工作。此外,如果这只是一种可怕的处理方式,我愿意接受其他建议。用例是在将数据导出之前对 docker 容器上的数据库进行更改。

标签: postgresqldockercommand-line-interface

解决方案


使用 Docker 处理字符串有时会有点难看。在您的情况下,我建议先使用双引号,然后使用以下命令转义内部双引号\

docker exec docker_name sh -c "psql dbname -U joeadmin -c \"update table set field='really_longstringwithabunf3493829#@#@#@#@#=';\""

一个更干净的选择是创建一个环境变量:

STR="really_longstringwithabunf3493829#@#@#@#@#="
docker exec docker_name sh -c "psql dbname -U joeadmin -c \"update table set field='${STR}';\""

请记住,字符串插值发生在主机操作系统中,而不是容器中(除非您使用\${STR}

更简洁的方法是创建一个文件,然后将其复制到容器中:

echo "update table set field='really_longstringwithabunf3493829#@#@#@#@#=';" > ~/myfile.txt
docker cp ~/myfile.txt docker_name:/tmp
docker exec docker_name sh -c "psql dbname -U joeadmin -f /tmp/myfile.txt"

推荐阅读