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