![쉘 스크립트에서 psql 테이블 레코드를 얻는 방법은 무엇입니까?](https://linux55.com/image/84631/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20psql%20%ED%85%8C%EC%9D%B4%EB%B8%94%20%EB%A0%88%EC%BD%94%EB%93%9C%EB%A5%BC%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 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"이라는 배열 셸 변수의 다른 요소는 설정하지 않습니다.