bash 배열에서 MySQL 결과 세트를 캡처하는 방법은 무엇입니까?

bash 배열에서 MySQL 결과 세트를 캡처하는 방법은 무엇입니까?

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

관련 정보