问题
所以我试图通过 SSH 对 postgres 数据库运行查询。我的命令如下所示:
ssh myserver.com sudo -u postgres psql -t -A -F"," -d web_user -c "'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;'"
但是我在查询中传递引号时遇到了问题。这是从上面的命令中提取的查询:
"'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;'"
据我了解,首先去除了外部双引号,因此字符串变为:
'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;'
现在我们有两对单引号(外对包裹整个查询字符串,内对包裹我查询中的模式名称(例如 'user_1.addresses'::regclass
) . 不幸的是,postgres 需要模式名称周围的那些单引号,所以我不能删除它们或用双引号替换。
这就是问题所在,第二次删除引号(我猜是通过 SSH?),查询无效,因为模式名称周围的单引号被删除了:
SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in (user_1.info::regclass, user_1.addresses::regclass) ;
因此,我们得到的不是对 postgres 完全有效的 'user_1.info'::regclass
,而是:user_1.info::regclass
我尝试了什么
我尝试转义模式名称中的单引号(参见:\'user_1.addresses\'::regclass
):
ssh myserver.com sudo -u postgres psql -t -A -F"," -d web_user -c "'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in (\'user_1.info\'::regclass, \'user_1.addresses\'::regclass) ;'"
我也试过从一个文件运行整个命令,这很有效,但我试图内联运行这个命令。据我所知,这是一个关于如何删除引号的问题(首先是所有双引号,然后是所有单引号),我一直无法找到解决方案。
有人可以帮忙吗?
谢谢:)
最佳答案
您不能在 shell 中的单引号内使用转义单引号。
最好使用 here-doc 并避免转义问题:
ssh -t -t myserver.com sudo -u postgres psql -t -A -F"," -d web_user -c<<'EOF'
SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;
exit
EOF
关于bash - 使用 SSH 在远程服务器上运行命令,但遇到引号问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37275459/