我确实想运行一个 SQL 命令,该命令通过 .bashrc 存储在 bash 变量中ssh postgres@hostname psql dbname -c SQL_COMMAND
。
考虑到 SQL 命令中有字符串,运行它的正确方法是什么,所以它被正确转义了?
例子:SQL_COMMAND="SELECT 'aaa'"
我正在寻找一种处理转义的解决方案,这样我就可以轻松地运行其他 SQL 命令,而不必自己转义它们。
这在 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 变量中。它似乎会起作用,但是某些元字符(例如)!
会引起问题。
似乎只为我工作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
选项的参数似乎可以工作。