Я хочу прочитать все строки в таблице и поместить их в отдельные переменные в 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

...

Как сделать так, чтобы полное имя попало в переменную name?

0
simernes 24 Фев 2020 в 15:16

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:~# 
0
Bernd Buffen 24 Фев 2020 в 12:50

Я предлагаю сначала использовать «CONCAT», а затем «IFS» для цикла while, например:

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")
0
DamianK 24 Фев 2020 в 13:11