Версии Bash и MySQL:
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
mysql Ver 14.14 Distrib 5.5.37, for debian-linux-gnu (x86_64) using readline 6.2
У меня есть скрипт bash, который пытается захватить результат запроса MySQL в переменную, используя подстановку команд с паролем MySQL в качестве переменной, содержащей знак доллара, и независимо от того, какой способ я пробую, он всегда либо не проходит аутентификацию с сообщением об отказе в доступе, либо запрос возвращает текст команды MySQL help. Я перепробовал десятки различных комбинаций обоих типов подстановки команд и экранирования символов, пока коровы не придут домой. Вот пример:
PASS='pass$word'; RESULT=`mysql -u user -p'${PASS}' -h RemoteHostName DBName -e "select count(*) from TableName;"`; echo "${RESULT}";
Это вернет сообщение «Доступ запрещен для пользователя»...
PASS='pass$word'; RESULT=`mysql -u user -p\'${PASS}\' -h RemoteHostName DBName -e \"select count\(*\) from TableName\;\"`; echo "${RESULT}";
Это вернет текст справки MySQL.
Любая помощь будет высоко оценена, заранее спасибо.
решение1
Ответ val0x00ff был правильным в разделе комментариев выше
RESULT=$(mysql -u user -p "${PASS}" -h RemoteHostName DBName -e "select count(*) from TableName;")
решение2
Вам нужно экранировать значение пароля, а не его использование:
PASS="pass\$word"; RESULT=`mysql -u user -p'${PASS}' -h RemoteHostName DBName -e "select count(*) from TableName;"`; echo "${RESULT}";
Поскольку все, что находится после $, интерпретируется как ссылка на переменную с именем $word
[user@host ~]$ echo "pass$word"
pass
[user@host ~]$ echo "pass\$word"
pass$word