我在 pull_news.sh (省略了变量声明):
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
后
$ ./pull_news.sh
我有
mysqldump: Got error: 1044: Access denied for user 'user'@'%' to database 'in' when selecting the database
如果我删除 where 子句,问题就消失了,所以在我看来,由于某种未知的原因,shell 只使用了 where 子句的第一个单词,并将第二个单词(the IN
)解析为数据库名称。
然后我把它换成了
--where="\"INFOCODE IN (SELECT INFOCODE FROM info_an_newsrelation WHERE MKTPOSTFIX = '.OC')\""
但它没有用。我现在不知道该怎么办,感谢任何帮助......
未引用
$@
的是问题。它扩展到函数的所有参数,然后,使它们受到分词(和通配符)的影响。把它放在引号中:原则上,其他变量也应该被引用 (
"${REMOTE_USERNAME}"
),尽管用户名和数据库名称不太可能包含空格(或 glob 字符)您实际作为参数传递的字符串不包含任何双引号。在 shell 处理(删除)引号之后,它只是字符串,如果您直接启动它而不是通过其他函数启动它,这就是它
--where=INFOCODE IN (SELECT ... = '.OC')
的方式。mysqldump
加上引号"$@"
可以保持这种状态。当然,对于标题中问题的答案,您可以通过反斜杠转义它们或将它们放在单引号中来传递文字双引号,就像任何其他命令一样: