3

我确实想运行一个 SQL 命令,该命令通过 .bashrc 存储在 bash 变量中ssh postgres@hostname psql dbname -c SQL_COMMAND

考虑到 SQL 命令中有字符串,运行它的正确方法是什么,所以它被正确转义了?

例子:SQL_COMMAND="SELECT 'aaa'"

我正在寻找一种处理转义的解决方案,这样我就可以轻松地运行其他 SQL 命令,而不必自己转义它们。

4

2 回答 2

3

这在 shell 中是很尴尬的。如果可以选择,我会使用对元字符不太敏感的脚本语言。壳只是痛苦。我知道获得可靠原始字符串的唯一方法是使用(a)输入函数,例如read;(b) 临时文件;或 (c) 使用此处引用的文档。

这就是我要做的,利用ssh通过标准输入的方式:

$ ssh hostname psql <<"__END__"
SELECT 'aaa!*#${notavar}' FROM "generate_series"(1,2);
__END__

     ?column?     
------------------
 aaa!*#${notavar}
 aaa!*#${notavar}
(2 rows)

不幸的是,您不能轻松地将其包装起来$( ... )以将其存储在 shell 变量中。它似乎会起作用,但是某些元字符(例如)!会引起问题。

于 2012-11-13T12:34:31.227 回答
0

似乎只为我工作psql -c "$SQLCOMMAND"

% export SQLCOMMAND='select "generate_series"(1, 5, 1);'
% echo $SQLCOMMAND
select "generate_series"(1, 5, 1);
% psql -c "$SQLCOMMAND"
 generate_series 
-----------------
               1
               2
               3
               4
               5
(5 rows)

或者

% export SQLCOMMAND="SELECT 'aaa' FROM \"generate_series\"(1,2);"
% echo $SQLCOMMAND
SELECT 'aaa' FROM "generate_series"(1,2);
% psql -c "$SQLCOMMAND"
 ?column? 
----------
 aaa
 aaa
(2 rows)

如果您可以将 SQL 语句正确地放入变量中,那么双引号psql's-c选项的参数似乎可以工作。

于 2012-11-13T10:33:42.553 回答