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