탭을 구분 기호로 사용하고 공백을 유지하면서 bash의 문자열을 변수로 구문 분석하는 방법은 무엇입니까?

탭을 구분 기호로 사용하고 공백을 유지하면서 bash의 문자열을 변수로 구문 분석하는 방법은 무엇입니까?

저는 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

관련 정보