Como passar um argumento contendo aspas duplas para uma função de script de shell?

0

Eu tenho em pull_news.sh (declarações de variáveis omitidas):

dump_table () {
   mysqldump --user=${REMOTE_USERNAME} --password=${REMOTE_PASSWORDS} --host=${REMOTE_HOST} --port=${REMOTE_PORT} --single-transaction --lock-tables=false $@
}

pull_news(){
    dump_table --set-gtid-purged=OFF --where="INFOCODE IN (SELECT INFOCODE FROM info_an_newsrelation WHERE MKTPOSTFIX = '.OC')" ${REMOTE_DBNAME} info_an_newscontent > ${DUMPFILE}
}

pull_news

Depois

$ ./pull_news.sh

Eu tenho

mysqldump: Got error: 1044: Access denied for user 'user'@'%' to database 'in' when selecting the database

O problema desapareceu se eu remover a cláusula where, então parece-me que, por alguma razão desconhecida, o shell apenas pegou a primeira palavra da minha cláusula where e analisou a palavra seconde (o IN ) como um banco de dados nome.

Então eu substituí-lo com

--where="\"INFOCODE IN (SELECT INFOCODE FROM info_an_newsrelation WHERE MKTPOSTFIX = '.OC')\""

mas não funcionou. Eu não sei o que fazer agora, qualquer ajuda é apreciada ...

    
por nichen 11.12.2017 / 09:36

1 resposta

1

O $@ sem aspas é o problema. Ele expande para todos os argumentos da função e, depois disso, os torna sujeitos a wordsplitting (e globbing). Coloque entre aspas:

dump_table () {
   mysqldump --user=... --lock-tables=false "$@"
}

As outras variáveis devem ser citadas também ( "${REMOTE_USERNAME}" ) apenas por uma questão de princípio, embora nomes de usuários e nomes de bancos de dados provavelmente não contenham espaços em branco (ou caracteres glob)

A string que você está passando como argumento não contém aspas duplas. Após o processamento de citação (remoção) pelo shell, é apenas a string --where=INFOCODE IN (SELECT ... = '.OC') e é assim que o mysqldump o veria, se você o iniciasse diretamente ao invés de através da outra função. Colocar as aspas em "$@" continua assim.

É claro que a resposta à pergunta no título, você pode passar aspas duplas literais por meio de barras invertidas, ou colocá-las entre aspas simples, como com qualquer outro comando:

somefunc "their name was \"$name\"" 
somefunc 'their name was "John"'
    
por 11.12.2017 / 12:48