
저는 CentOS 7에서 bash 쉘을 사용하고 있습니다. 쉘 스크립트에서 MySQL 쿼리를 실행하고 각 결과 행을 반복하고 싶습니다. 4개의 행이 반환된 경우 다음과 같이 배열의 4개 행을 캡처할 수 있다고 생각했습니다.
query="select p.id, p.ebook_id, es.id FROM ...";
echo "$query" > /tmp/query.sql
mysql -u user --password=pass db_id < /tmp/query.sql > /tmp/query.csv
linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
arraylength=${#linesIN[@]}
echo $arraylength
그러나 반환된 여러 결과 행을 볼 수 있더라도 $arraylength
항상 출력됩니다 . 1
배열의 각 요소가 결과 집합의 한 행을 나타내는 결과 배열을 올바르게 생성하려면 위 내용을 어떻게 수정해야 합니까?
답변1
와 더불어--batch
옵션, mysql
결과는 한 줄에 하나의 레코드로 출력되어야 하며 열은 탭으로 구분되어야 합니다. 다음을 사용하여 배열의 행을 읽을 수 있습니다.배쉬의mapfile
프로세스 대체 또는 명령 대체 및 배열 할당:
mapfile results < <( mysql --batch ... < query.sql )
또는
set -f # disable globbing
IFS=$'\n' # set field separator to NL (only)
results=( $(mysql --batch ... ) )
( IFS
이후에는 수정된 상태로 유지되고 글로빙이 비활성화됩니다.)
그런 다음 행의 열을 일부 변수로 분할하려면 다음을 수행하십시오.
IFS=$'\t' read -r col1 col2 col2 ... <<< "${results[0]}"
당신의 과제
linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
는 아니다배열 할당(괄호가 빠졌네요) 단지 명령 대체의 출력을 일반 문자열 변수에 할당합니다. (모든 줄바꿈이 여기에 포함되지만 여전히 단일 문자열입니다.) ${#linesIN[@]}
Bash/ksh 단일 요소 배열과 스칼라 변수는 동일하게 작동하므로 여전히 작동합니다.
답변2
이를 수행하는 또 다른 방법은 명령의 출력을 while 루프로 파이프하는 것입니다. -N을 포함하거나 결과에 열 이름이 포함되기를 원합니다.
#!/bin/bash
#Script to read output from a mysql command line by line
mysql -uroot -p example -N -e "select column from table" | while IFS= read -r loop
do
echo "$loop"
done
그리고 단순히 개수를 확인하고 싶다면 a를 수행 select count(columnName)
하고 결과를 인쇄하면 됩니다.
답변3
쿼리에서 반환된 행 수와 동일한 파일의 줄 수를 원할 경우 wc
파일의 줄 수를 계산하는 데 사용하면 됩니다.
arraylength=$( wc -l < /tmp/query.csv)
echo $arraylength