Мне нужно загрузить БД на сервер MySQL и следующая команда работает из оболочки:
Из оболочки

mysql -h "172.17.0.2" -u "root"  -p"mypasswd" -Bse "create database mydb;"

Но не из скрипта, в котором ip и пароль являются переменными, передаваемыми в качестве аргументов:

Сценарий:

#!/bin/bash

set -e
sqlname=$1
sqlpass=$2
sqlip=$3
...  
set -x
echo "Creating the database..."
mysql -h $sqlip -u "root" -p$sqlpass -Bse "create database mydb;"

Результат работы скрипта:

./myscript.sh mysql1 mypasswd 172.17.0.2

Создание базы данных ...
+ mysql -h 172.17.0.2 -u root -pmypasswd -Bse 'создать базу данных mydb;'
ОШИБКА 2003 (HY000): не удается подключиться к серверу MySQL на 172.17.0.2 (111)

- начать редактирование
Тот же результат для переменных внутри двойных кавычек:

#!/bin/bash  
...  
mysql -h "$sqlip" -u root -p"$sqlpass" -Bse "create database mydb;"

+ echo 'Создание базы данных ...«Создание базы данных ...
+ mysql -h 172.17.0.2 -u root -pmypasswd -Bse 'создать базу данных mydb;' ОШИБКА 2003 (HY000): не удается подключиться к серверу MySQL на 172.17.0.2 (111)

- конец редактирования

Двойные кавычки и одиночные кавычки с переменными внутри скрипта смущают меня.

Я упускаю что-то очевидное здесь об использовании переменных внутри и с кавычками.

Любой намек?

2 ответа2

1

Использование кавычек позволяет остановить интерпретацию оболочкой некоторых символов пунктуации, таких как пробел (разделитель параметров), > (перенаправление вывода), * (подстановочный знак в маске файла) и т.д.

Одинарные кавычки останавливают всю интерпретацию цитируемого текста, в то время как двойные кавычки допускают расширение $ (и некоторые другие). Команда внутри скрипта ничем не отличается от введенной в интерактивном режиме.

IP-адрес не имеет специфичных для оболочки символов и не имеет root , поэтому их не нужно заключать в кавычки. Если ваш пароль содержит специфичные для оболочки символы, такие как пробел, его нужно будет заключить в кавычки, а поскольку для него требуется расширение $ они должны быть в двойных кавычках. Параметр -Bse имеет пробел и ; , поэтому он должен заключать в кавычки, но любой из них подойдет, так как нет расширения $ .

Переменные, которые вы $sqlip и $sqlpass должны быть определены в подоболочке, которая выполняет сценарий, поэтому они должны быть установлены в подоболочке или установлены как export в вызывающей оболочке.

1

Возможно, в переменной пароля есть некоторые символы, которые обрабатываются специально оболочкой.

Как правило, рекомендуется всегда заключать в кавычки переменные оболочки, чтобы избежать нежелательных побочных эффектов, таких как разделение токенов и расширение по шаблону. См. Когда необходимо двойное цитирование? из Unix и Linux Stack Exchange.

mysql -h "$sqlip" -u root -p"$sqlpass" -Bse "create database mydb;"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .