itsource

mysql 출력을 bash 변수로 구문 분석하면 공백으로 인해 깨집니다.

mycopycode 2023. 10. 9. 22:35
반응형

mysql 출력을 bash 변수로 구문 분석하면 공백으로 인해 깨집니다.

테이블의 모든 행을 읽고 개별 변수에 bash로 넣으려고 하는데 셀 항목에 공백이 있는 경우 문제가 발생합니다.

while read id name neighbourhood city
do
        echo "ID: $id"
        echo "name: $name"
        echo "neighbourhood: $neighbourhood"
        echo "city: $city"
        echo -e "\n"
done < <(echo "SELECT id, name, neighbourhood_id, city_id FROM households" | mysql -u kong -pHarald city_planner -h 0)

만약에name하나의 단어일 뿐 모든 것이 괜찮아 보이지만 공백으로 구분된 세 개의 개별 단어가 있으면 다음과 같이 됩니다.

...

ID: 200
name: Durek
neighbourhood: 1
city: 2


ID: 201
name: Kong
neighbourhood: Harald
city: Rex   1   2

...

어떻게 하면 전체 이름이 이름 변수에 들어가게 만들 수 있습니까?

공백이 있는 문자열을 하나만 가지고 있다면 마지막 위치에 놓을 수 있습니다.

root@localhost:~# while read id neighbourhood city name
> do
>         echo "ID: $id"
>         echo "name: $name"
>         echo "neighbourhood: $neighbourhood"
>         echo "city: $city"
>         echo -e "\n"
> done < <(echo "SELECT id, neighbourhood_id, city_id, name FROM households" | mysql -u root Bernd -N)
ID: 200
name: Durek
neighbourhood: 1
city: 2


ID: 201
name: Kong Harald Rex
neighbourhood: 1
city: 2


root@localhost:~# 

저는 다음과 같이 "CONCAT"를 먼저 사용하고 "IFS"를 사용하는 것을 제안합니다.

while IFS='@' read -r id name neighbourhood city
do
    echo "ID: $id"
    echo "name: $name"
    echo "neighbourhood: $neighbourhood"
    echo "city: $city"
    echo -e "\n"

done < <( mysql -u kong -pHarald city_planner -h 0 -NBe "SELECT CONCAT(id, '@', name, '@', neighbourhood_id, '@', city_id ) FROM households")

언급URL : https://stackoverflow.com/questions/60375798/parsing-mysql-output-into-bash-variables-is-broken-by-white-spaces

반응형