![Shell scipt의 select 문에 대한 파일 입력](https://linux55.com/image/108250/Shell%20scipt%EC%9D%98%20select%20%EB%AC%B8%EC%97%90%20%EB%8C%80%ED%95%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9E%85%EB%A0%A5.png)
Select 문에 대한 입력이 포함된 텍스트 파일이 있습니다.
sqlplus -s $USERNAME/$PASSWORD@$HOST<<EOF
spool $DIRECTORY/UPDATE.xls
select acc,cr,dr from count
where acc in ***$DIRECTORY/acc.txt***;
spool off;
exit
EOF
강조 표시된 부분의 입력으로 텍스트 파일을 사용하는 방법을 알려주십시오.
답변1
먼저 파일을 배열로 읽어옵니다.
다음은 한 줄의 값이 포함된 파일입니다.
read -ar values < "$DIRECTORY"/acc.txt
여러 줄 파일의 경우 루프를 사용합니다(한 줄에 하나의 값).
while read -r v; do
values+=("$v")
done < <(cat "$DIRECTORY"/acc.txt)
Archemar의 의견에 따르면 SQL 구문은 var in ( "value1", "value2", ... )
이므로 일부 텍스트 처리가 필요합니다.
첫 번째 인용문:
for i in "${values[@]}"; do quoted_values+=(\""$i"\"); done
둘째, 쉼표와 공백으로 구분합니다.
limit="${#quoted_values[@]}"
for ((i=0; i<"$limit"; i++ )); do
values_string="$values_string""${quoted_values[$i]}"
((limit-i-1)) && values_string="$values_string",
values_string="$values_string"" "
done
여기 문서에는 값 목록 주위에 괄호가 표시됩니다.
sqlplus -s "$USERNAME"/"$PASSWORD"@"$HOST"<<EOF
spool "$DIRECTORY"/UPDATE.xls
select acc,cr,dr from count
where acc in ( "$values_string" );
spool off;
exit
EOF
테스트를 거치지 않아 오타 등이 있을 수 있습니다. 질문이 있으시면 댓글을 달아주세요.
답변2
텍스트 파일에서 선택하는 매우 간단한 방법은 다음과 같습니다.
cat ${DIRECTORY}/UPDATE.txt |
while read acc_id ; do
select acc,cr,dr from count
where acc in ${acc_id};
done
그게 다야.