BASH MySQL вывод в динамические c переменные - PullRequest
0 голосов
/ 02 апреля 2020

Я использую следующий оператор BASH mysql, чтобы получить данные из моей БД.

mysql -N -u root --password=ROOT DB -h 127.0.0.1 -e "SELECT * FROM site where id like '1234'" | while read A B C D E F G H I J K L M N O P Q R S T U V W X Y Z; do
    echo $A
    echo $B
done

Чтобы получить все значения от A до Z, этот способ выглядит сложным.

Как я могу сделать это лучше и создавать переменные, основываясь на названии значения read и результатах. ?

например: create var A which contains value of $A and do this all the way upto var Z containing the value of $Z

Это только пример, значения не будут называться AZ, но будут иметь собственные имена. Есть ли способ создать переменную, основанную на истинном собственном имени, а затем связать с ней значение?

Например:

mysql -N -u root --password=ROOT DB -h 127.0.0.1 -e "SELECT * FROM site where id like '1234'" | while read site_id site_location site_size etc.......; сделать

Спасибо

1 Ответ

1 голос
/ 02 апреля 2020

Вызов 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'"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...