Mysql 具有嵌套变量的奇数bash行为
我喜欢将我的连接和常规转储设置放入变量中,然后将它们馈送到Mysql 具有嵌套变量的奇数bash行为,mysql,bash,Mysql,Bash,我喜欢将我的连接和常规转储设置放入变量中,然后将它们馈送到mysqldump中,如下所示: # echo mysqldump ${SRC_SRV} ${SRC_SQL_OPT} mysqldump -u root -pPass -h host --where="COL > '2016-08-14' AND COL <= '2016-08-15'" --opt --single-transaction --skip-triggers --no-create-db --no-create
mysqldump
中,如下所示:
# echo mysqldump ${SRC_SRV} ${SRC_SQL_OPT}
mysqldump -u root -pPass -h host --where="COL > '2016-08-14' AND COL <= '2016-08-15'" --opt --single-transaction --skip-triggers --no-create-db --no-create-info dbase table
请注意,当我echo
-这一切看起来都很正常,但如果我尝试在bash
中运行它,我会得到一个错误:
mysqldump: Got error: 1049: Unknown database '>' when selecting the database
下面是(bash-x
)的原因:
+mysqldump-u root-pPass-h host'-where=“COL'>'\''2016-08-14'\''和COL'您的第一个命令与您可能使用的bash变量版本之间存在显著差异
当您运行一个命令(例如第一个代码块中的命令)时,双引号由bash本身解释,并且内容作为单个参数发送到该命令
在bash变量中,您显式地插入了一个文字引号。使bash以您想要的方式进行解析的唯一方法是eval
命令,因为它包含引号内和引号外的空格
在bash中执行此操作的最干净的方法是避免在命令中使用此类嵌套变量。在您的情况下,在运行命令之前不要使SRC\u SQL\u OPT
。或者至少不要包含--where
-部分。
包含以下字符串:
--where="COL > '2016-08-14' AND COL <= '2016-08-15'" --opt --single-transaction --skip-triggers --no-create-db --no-create-info dbase table
使用不同的内部磁场分离器,例如:
WHERE="COL > '2016-08-14' AND COL <= '2016-08-15'"
SRC_SRV="-u;root;-pPass;-h;host"
SRC_SQL_OPT="--where=\"$WHERE\";--opt;--single-transaction;--skip-triggers;--no-create-db;--no-create-info;$DB;$TBL"
IFS=';' mysqldump $SRC_SRV $SRC_SQL_OPT
WHERE=“COL>'2016-08-14'和COL
--where="COL > '2016-08-14' AND COL <= '2016-08-15'" --opt --single-transaction --skip-triggers --no-create-db --no-create-info dbase table
WHERE="COL > '2016-08-14' AND COL <= '2016-08-15'"
SRC_SQL_OPT="--opt --single-transaction --skip-triggers --no-create-db --no-create-info ${DB} ${TBL}"
mysqldump $SRC_SRV --where="$WHERE" $SRC_SQL_OPT
WHERE="COL > '2016-08-14' AND COL <= '2016-08-15'"
SRC_SRV="-u;root;-pPass;-h;host"
SRC_SQL_OPT="--where=\"$WHERE\";--opt;--single-transaction;--skip-triggers;--no-create-db;--no-create-info;$DB;$TBL"
IFS=';' mysqldump $SRC_SRV $SRC_SQL_OPT