Вызов mysql
должен быть передан в то время как l oop таким образом:
while read -r site_id site_location site_size _ ; do
echo "$site_id" "$site_location" "$site_size"
done < <(
mysql -N -u root --password=ROOT DB -h 127.0.0.1 -e "SELECT * FROM site where id like '1234'"
)
Перенаправление < <(command)
позволяет command
выполняться в под-оболочке , но кормите основной поток read
. Поэтому, когда оно read -r var1 var2 ... varn < <(command)
, переменные действительны для основного потока.
Принимая во внимание, что command | read -r var
имеет command
для выполнения в основном потоке и read
для выполнения в под-оболочке, а переменная только допустимо в под-оболочке.
Получение имен переменных, соответствующих каждому имени столбца из таблицы
Этот сценарий считывает описание таблицы и создает массив vars
, содержащий имена столбцов.
Он читает, создает и печатает каждую переменную оболочки этих имен, используя косвенное обращение.
#!/usr/bin/env bash
# Pupulate the vars array with the column names from the table
IFS=$'\n' read -r -d '' -a vars < <(
mysql -N -u root --password=ROOT DB -h 127.0.0.1 -e 'SHOW COLUMNS FROM site' |
cut -d ' ' -f1
)
# Output column headers
printf '%s\t' "${vars[@]}"
# read and create variables names matching column names
while read -r "${vars[@]}"; do
for varname in "${vars[@]}"; do
# Use ! indirection to print the value for the variable
printf '%s\t' "${!varname}"
done
done < <(
mysql -N -u root --password=ROOT DB -h 127.0.0.1 -e "SELECT * FROM site where id like '1234'"
)