Bash scripting: executa um comando shell dentro de um script com variável dentro de citações

0

Eu preciso carregar um banco de dados em um servidor mysql e o seguinte comando funciona a partir do shell:
Do shell

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

Mas não do script, no qual o ip e a senha são variáveis passadas como argumentos:

O script:

#!/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;"

O resultado do script:

./myscript.sh mysql1 mypasswd 172.17.0.2

Creating the database...
+ mysql -h 172.17.0.2 -u root -pmypasswd -Bse 'create database mydb;'
ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.2' (111)

- begin edit
O mesmo resultado para as variáveis entre aspas duplas:

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

+ echo 'Creating the database...' Creating the database...
+ mysql -h 172.17.0.2 -u root -pmypasswd -Bse 'create database mydb;' ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.2' (111)

- end end

Aspas duplas e aspas simples com variáveis dentro do script me confundem.

Estou sentindo falta de algo óbvio aqui sobre o uso de variáveis dentro e com aspas.

Alguma dica?

    
por AJN 18.04.2018 / 16:05

2 respostas

1

O uso de aspas é para parar o shell interpretando certos caracteres de pontuação, como espaço (separador de parâmetro), > (redirecionamento de saída), * (curinga na máscara de arquivo), etc.

As aspas simples interrompem toda a interpretação do texto citado, enquanto as aspas duplas permitem a expansão $ (e algumas outras). O comando dentro de um script não é diferente daquele digitado para um prompt interativo.

O endereço IP não possui caracteres específicos do shell, nem root , portanto, eles não precisam ser citados. Se a sua senha tiver caracteres específicos do shell, como um espaço, ela precisará ser citada e, como ela exige a expansão $ , ela precisará ter aspas duplas. O parâmetro -Bse tem espaço e ; , por isso precisa de cotação, mas também o fará, pois não há $ de expansão.

As variáveis que você está expandindo $sqlip e $sqlpass precisam ser definidas dentro da subshell que executa o script, então elas precisam ser definidas na subshell ou definidas como export no shell de chamada.

    
por 18.04.2018 / 16:39
1

É possível que haja alguns caracteres na variável de senha que são tratados especialmente pelo shell.

Como regra geral, é uma prática recomendada sempre citar as variáveis do shell para evitar efeitos colaterais indesejados, como divisão de token e expansão de curingas. Veja Quando é necessário fazer uma cotação dupla? do Unix e do Linux Stack Exchange. / p>

mysql -h "$sqlip" -u root -p"$sqlpass" -Bse "create database mydb;"
    
por 18.04.2018 / 16:48