Bash 스크립트의 긴 psql 명령을 여러 줄로 분할하는 방법

Bash 스크립트의 긴 psql 명령을 여러 줄로 분할하는 방법

bash 쉘 스크립트에서 실행하고 싶은 매우 긴 psql 명령이 있는데 이를 여러 줄로 분할하는 올바른 방법이 무엇인지 알고 싶습니다. 표준 Unix 스크립트 "구분자" 백슬래시 문자는 효과가 없습니다. 물론 postgres 환경에서는 한 줄씩 계속 실행할 수 있으며 닫는 세미콜론을 입력할 때까지 명령이 처리되지 않지만 쉘 스크립트에서는 이를 사용하지 않습니다.

내 명령은 다음과 같습니다

sudo -u postgres /opt/puppet/bin/psql puppetdb -t -c "select certname, r.value as role, e.value as env from certname_facts r join certname_facts e using (certname) where r.name = 'role' and e.name = 'env' order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

명령을 변경하고 싶지 않습니다. 수동으로 입력하면 모든 것이 잘 작동하지만 다음과 같이 분기된 항목으로 변환하는 올바른 방법을 알아야 합니다.

sudo -u postgres /opt/puppet/bin/psql puppetdb -t
-c "select certname, r.value as role, e.value as env
from certname_facts r join certname_faces e using (certname)
where r.name = 'role' and e.name = 'env'
order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

어떤 제안이 있으십니까?

답변1

표시된 것처럼 바운스로 분할하는 데 아무런 문제가 없습니다. 그러나 일반적으로 stdin을 통해 SQL을 보내는 것이 더 좋습니다. 이는 postgres의 경우 특히 그렇습니다. "-c" 옵션은 하나의 명령에서만 출력을 반환하도록 고정되어 있는 반면, stdin에서 명령을 수락하면 원하는 만큼 많은 명령을 함께 쌓을 수 있기 때문입니다. 따라서 다음과 같은 작업을 수행합니다.

sudo -u postgres /opt/puppet/bin/psql puppetdb -t  <<SQL | ...
  select certname, r.value as role, e.value as env
      from certname_facts r join certname_faces e using (certname)
      where r.name = 'role' and e.name = 'env'
      order by role,env,certname
SQL

Bash 변수를 여기에 삽입할 수 있습니다. 이를 방지하려면 첫 번째 사례를 인용하세요 SQL.

sudo -u postgres /opt/puppet/bin/psql puppetdb -t <<'SQL' | ...

답변2

죄송합니다. 방금 표준 백슬래시 문자를 사용해 보았는데 제대로 작동했습니다.

sudo -u postgres /opt/puppet/bin/psql puppetdb -t \
-c "select certname, r.value as role, e.value as env \
from certname_facts r join certname_faces e using (certname) \
where r.name = 'role' and e.name = 'env' \
order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

동료 DBA는 이것이 "표준" Unix 명령이 아니라 SQL 명령이기 때문에 작동하지 않을 것이라고 말했습니다. 믿기 ​​전에 직접 시도해 보아야 할 것 같습니다!

답변3

기본 쿼리만 입력하고 싶다면 다음과 같이 하면 됩니다.

SELECT * 
FROM table_name ... 

그런 다음 WHERE 및 ORDER BY와 같은 추가 항목이 있습니다. 알고 싶은 것은 쿼리의 연속된 한 줄만 입력하지 않도록 이를 별도의 줄로 깔끔하게 접는 방법입니다.

다음 줄로 이동하려면 Enter 키를 누르세요. Psql은 .psql 파일을 입력할 때까지 쿼리를 수락하지 않습니다 ;.

다음 예와 같이 대소문자는 구분하지만 공백은 구분하지 않는다는 점에 유의하세요.

mycomputer=# SELECT *
mycomputer-# FROM sacramento 
mycomputer-# WHERE beds <= 1
mycomputer-# LIMIT 20;

또한 의미가 없는 내용을 입력하면 psql이 아무 것도 알려주지 않는다는 점을 아는 것도 중요합니다! 그냥 다음 줄로 넘어갑니다.

또한 다시 사용할 긴 쿼리를 작성하는 경우 쿼리가 포함된 파일을 편집하고 .psql 을 사용하여 호출하는 것이 더 효율적이라는 점을 알아두면 좋습니다 \i file_name.

다음 블로그 게시물은 시작할 때 많은 도움이 되었습니다.

명령줄의 postgresql

관련 정보