を介してbash変数に格納されるSQLコマンドを実行したいと思いますssh postgres@hostname psql dbname -c SQL_COMMAND
。
SQLコマンドに文字列が含まれていることを考えると、これを実行する適切な方法は何ですか?適切にエスケープされますか?
例:SQL_COMMAND="SELECT 'aaa'"
エスケープを処理するソリューションを探しているので、自分でエスケープしなくても他のSQLコマンドを簡単に実行できます。
これをシェルで行うのは非常に厄介です。選択肢が与えられた場合は、メタ文字にあまり敏感でないスクリプト言語を使用します。シェルはただ痛いです。信頼できる生の文字列を取得するために私が知っている唯一の方法は、(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)
$( ... )
残念ながら、それを簡単にラップしてシェル変数に格納することはできません。うまくいくように見えますが、特定のメタキャラクターのようなもの!
は問題を引き起こします.
するだけでうまくいくようです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
オプションに二重引用符で囲むことはうまくいくようです。