문자열의 여러 값을 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 구문 오류가 발생합니다. 그 뒤에 공백이 있어야 합니다 *.

관련 정보