У меня есть скрипт с жестко запрограммированным bash массивом mysql переменных подключения. Сценарий сейчас в основном так:
declare -a dbarr=($devdb1 $devdb2)
for db in "${dbarr[@]}"; do
mysql $db -NBe "show variables like 'key_buffer_size';"
done
Это работает без проблем.
Однако я бы хотел вместо этого переместить их в файл вместо жестко их кодировать (их несколько сотен), например:
dev|$devdb1
dev|$devdb2
tst|$tstdb1
..
каждая переменная в приведенном выше списке разрешается в такой параметр, как:
--defaults-extra-file=/home/mysql/env/devserver.devdb1
--defaults-extra-file=/home/mysql/env/devserver.devdb2
--defaults-extra-file=/home/mysql/env/testserver.tstdb1
Затем вы можете просто подключиться к mysql вроде:
mysql $devdb1
если я прочитаю их (через readarray или через некоторое время l oop), единственный способ заставить это работать - использовать eval
envfile="/home/mysql/env/envfile"
readarray -t envarr < <(gawk -F'|' '/^dev/{print $2}' "${_envfile}")
for db in "${envarr[@]}"; do
eval "connstr=$db"
mysql $connstr -NBe "show variables like 'key_buffer_size';"
done
Без eval он завершается с:
+ mysql '$devdb1' -NBe 'show variables like '\''key_buffer_size'\'';'
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
+ mysql '$devdb2' -NBe 'show variables like '\''key_buffer_size'\'';'
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Способом only , который, как я обнаружил, имеет $ devdb1, et c. «resolved» относится к eval - что я понимаю в опасности - но я не нашел другого способа.
Я попытался использовать $ {! db} вместо eval выше, но ничего не возвращает.