文字列の複数の値を bash のファイル値に置き換えます。

文字列の複数の値を bash のファイル値に置き換えます。

catを実行し、それを変数 "SQL"に割り当てるSQLファイルがあります。 SQLファイルには他のデータベースとは異なるテーブルがあります。 sedを使用してテーブルとデータベースの値をファイルに格納されている値に置き換えようとしますが、実行するたびに奇妙な結果が出ます。私が試したことは次のとおりです。

SQLファイルクエリ:

SELECT *from DATABASE1.TABLE1
UNION ALL
SELECT *from DATABASE2.TABLE2
UNION ALL
SELECT *from DATABASE3.TABLE3
UNION ALL
SELECT *from DATABASE4.TABLE4

データベースとテーブルの詳細を含む.shファイル:

#!/bin/bash
DATABASE1="hr"
TABLE1="emp"
DATABASE2="account"
TABLE2="employee_details"
DATABASE3="payable"
TABLE3="job_details"
DATABASE4="dummy"
TABLE4="basic_details"

上記の値を使用する前に、シェルから値の詳細を取得できるように.shファイルをインポートします。


SQL=`cat query.sql`

query=$(echo $SQL| sed -e "s/DATABASE1/${DATABASE1}/;s/DATABASE2/${DATABASE2}/;
s/DATABASE3/${DATABASE3}/;s/DATABASE4/${DATABASE4}/;s/TABLE1/${TABLE1}/;
s/TABLE2/${TABLE2}/;s/TABLE3/${TABLE3}/;s/TABLE4/${TABLE4}/")

上記の方法を使用すると、奇妙な結果が得られましたが、シェルにデータベースとテーブル変数を代入し、それを上記のクエリに使用することで目的の結果を得ることができました。 .shファイル方式で私が間違っていることを教えてください。

ベストアンサー1

これを行うためのツールがすでにありますenvsubst$foo文字列をその変数の値に置き換えて、特殊文字を見事に処理します。

それにもかかわらず、SQL構文エラーが発生します。その後にスペースが必要です*

おすすめ記事