Bash Array: интерпретировать элемент как литерал - PullRequest
1 голос
/ 27 февраля 2020

У меня есть скрипт с жестко запрограммированным 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 выше, но ничего не возвращает.

1 Ответ

0 голосов
/ 27 февраля 2020

Вы можете использовать Bash "косвенное расширение" здесь. См. Что такое косвенное расширение? Что означает $ {! Var *}? . Вместо сохранения $varname в файле просто сохраните varname (например, dev|devdb1). При обработке строки файла поместите имя переменной в переменную, скажем, dbv, а затем используйте косвенное расширение, чтобы получить значение ссылочной переменной. Например,

mysql "${!dbv}" -NBe "show variables like 'key_buffer_size';"

Обратите внимание, что в вашем примере кода отсутствуют кавычки в некоторых местах, где было бы безопаснее их иметь, хотя бы во избежание появления таинственных сообщений об ошибках, если вы получаете неожиданные значения в переменных. Используйте Shellcheck , чтобы проверить ваш код на предмет пропущенных кавычек и многих других проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...