쉘 스크립트에서 psql 테이블 레코드를 얻는 방법은 무엇입니까?

쉘 스크립트에서 psql 테이블 레코드를 얻는 방법은 무엇입니까?

나는 postgresql을 가지고 있고 10개의 레코드가 있는 테이블을 가지고 있으므로 쉘 스크립트의 10개 레코드에 대해 10개의 지역 변수를 원합니다.

다음 방법을 사용해 보았지만 list123[1]...list123[9] 대신 list123[0] 변수에 모든 레코드를 저장합니다.

declare -a list123
list123=( "$(psql -t -h 10.100.0.1 -U prasad statistics -c "select command from jobhandler.config_info where conf_name like '%stager%'")" )

list123[0-9]의 각 레코드에 해당하는 레코드를 원합니다.

답변1

문제는 명령 대체에 큰따옴표를 사용했기 때문에 발생합니다 $(). 이는 전체 출력을 단일 여러 줄 문자열로 변환합니다.

노력하다:

declare -a list123
list123=( $(psql -t -h 10.100.0.1 -U prasad statistics -c "select command from jobhandler.config_info where conf_name like '%stager%'") )

귀하의 테이블은 없지만 간단한 ID, 이름, dob 테이블을 사용하여 내 시스템에서 테스트했습니다.

$ list123=($(psql -t -c 'select dob from newtable'))
$ set | grep list123
list123=([0]="1967-03-07" [1]="1964-08-07" [2]="1992-10-19" [3]="1964-12-18" [4]="1945-12-26")

답변2

귀하의 질문에 답변을 드리고 있는지 잘 모르겠습니다. 10개의 문자열 배열을 로컬 변수로 사용하시겠습니까, 아니면 각각 문자열을 포함하는 10개의 셸 변수를 사용하시겠습니까?

후자에는 이상한 트릭이 필요합니다.

#!/bin/bash

COUNTER=1
eval $(psql -t -h 10.100.0.1 -U prasad statistics -c "select command from jobhandler.config_info where conf_name like '%stager%'" |
while read VAR
do
    echo "list123$COUNTER='$VAR'"
    ((COUNTER = COUNTER + 1))
done)

echo list1231="$list1231"
echo list1232="$list1232"

이 변형은 "list1231", "list1232", "list1233"...이라는 이름의 셸 변수를 설정하게 되지만 "list123"이라는 배열 셸 변수의 다른 요소는 설정하지 않습니다.

관련 정보