저는 MySQL 데이터베이스의 일부 통계를 포함하여 다양한 통계를 표시하기 위해 bash 스크립트를 작성 중입니다. 문제가 있는 관련 코드는 다음과 같습니다.
read min max rows <<< $(mysql $dbDatabase -u $dbUser -p$dbPass -B -N -e \
"SELECT MIN(\`DateTime\`), MAX(\`DateTime\`), COUNT(*) FROM $dbTable")
echo "Min Date:" $min
echo "Max Date:" $max
echo "Total Rows:" $rows
실행 결과는 다음과 같습니다.
Min Date: 2013-03-18
Max Date: 20:30:00
Total Rows: 2014-07-31 14:30:00 11225139
이것은 분명히 내가 원하는 것이 아닙니다(날짜/시간 값이 분할되었습니다).
Google에 따르면 $IFS
내 질문에 대한 답변이 되어야 합니다. 불행히도 여전히 결과를 올바르게 구문 분석할 수 없습니다.
IFS=$'\t' read min max rows <<< ...
결과 :
Min Date: 2013-03-18 20:30:00 2014-07-31 14:30:00 11225139
Max Date:
Total Rows:
msyql -B | tr $'\t' 'X'
필드가 탭으로 구분되어 있다는 것을 시각적으로 증명하기 때문에 이것이 이상하다는 것을 알았습니다 .
해결 방법으로 다음과 같은 작업을 수행하여 원하는 출력을 생성할 수 있습니다.
read min max rows <<< $(mysql $dbDatabase -u $dbUser -p$dbPass -B -N -e \
"SELECT MIN(\`DateTime\`), MAX(\`DateTime\`), COUNT(*) FROM $dbTable" \
| tr ' ' '.')
min=$(tr '.' ' ' <<< $min)
max=$(tr '.' ' ' <<< $max)
echo "Min Date:" $min
echo "Max Date:" $max
echo "Total Rows:" $rows
그러나 이는 우아해 보이지도 않고 "유닉스 방식"으로 보이지도 않습니다.
내가 뭘 잘못하고 있는지, 왜 $IFS
작동하지 않는지, 깨끗하고(해킹되지 않은) 이해하기 쉬운 코드를 갖는 올바른 사용법이 무엇인지 아는 사람이 있습니까?
답변1
명령 대체 결과 주위에 따옴표가 필요합니다. "$(command)"
예를 들어 (로 쿼리를 시뮬레이션하는 경우 echo
) 다음과 같습니다.
$ IFS=$'\t' read min max rows <<< "$(echo -e "Wed Jul 30 15:40:38 EDT 2014\tThu Jul 31 15:40:38 EDT 2014\t27")"
$ echo "$min"; echo "$max"
Wed Jul 30 15:40:38 EDT 2014
Thu Jul 31 15:40:38 EDT 2014
또는 (더 직접적으로) 사용프로세스 교체대신에
$ IFS=$'\t' read min max rows < <(echo -e "Wed Jul 30 15:40:38 EDT 2014\tThu Jul 31 15:40:38 EDT 2014\t27")
$ echo "$min"; echo "$max"
Wed Jul 30 15:40:38 EDT 2014
Thu Jul 31 15:40:38 EDT 2014