3

を介してbash変数に格納されるSQLコマンドを実行したいと思いますssh postgres@hostname psql dbname -c SQL_COMMAND

SQLコマンドに文字列が含まれていることを考えると、これを実行する適切な方法は何ですか?適切にエスケープされますか?

例:SQL_COMMAND="SELECT 'aaa'"

エスケープを処理するソリューションを探しているので、自分でエスケープしなくても他のSQLコマンドを簡単に実行できます。

4

2 に答える 2

3

これをシェルで行うのは非常に厄介です。選択肢が与えられた場合は、メタ文字にあまり敏感でないスクリプト言語を使用します。シェルはただ痛いです。信頼できる生の文字列を取得するために私が知っている唯一の方法は、(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)

$( ... )残念ながら、それを簡単にラップしてシェル変数に格納することはできません。うまくいくように見えますが、特定のメタキャラクターのようなもの!は問題を引き起こします.

于 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-cオプションに二重引用符で囲むことはうまくいくようです。

于 2012-11-13T10:33:42.553 に答える