我确实希望运行一个SQL命令,它通过ssh postgres@hostname psql dbname -c SQL_COMMAND
存储在bash变量中。
考虑到SQL命令中有字符串,运行它的正确方法是什么,所以它被正确转义?
示例:SQL_COMMAND="SELECT 'aaa'"
我正在寻找一个解决转义问题的解决方案,因此我可以轻松运行其他SQL命令而无需自己逃避它们。
答案 0 :(得分:3)
在shell中做这个很尴尬。鉴于我的选择,我会使用对元字符不太敏感的脚本语言。外壳很痛苦。我知道获得可靠原始字符串的唯一方法是使用(a)像read
之类的输入函数; (b)临时档案;或(c)引用此处文件。
这就是我要做的事情,利用ssh
传递stdin的方式:
$ ssh hostname psql <<"__END__"
SELECT 'aaa!*#${notavar}' FROM "generate_series"(1,2);
__END__
?column?
------------------
aaa!*#${notavar}
aaa!*#${notavar}
(2 rows)
不幸的是,您无法轻松地将其包装在$( ... )
中以将其存储在shell变量中。它似乎有效,但某些元字符如!
会导致问题。
答案 1 :(得分: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
的{{1}}选项的参数双重引用。