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"'