gpt4 book ai didi

mysql - 带有嵌套变量的奇怪 bash 行为

转载 作者:行者123 更新时间:2023-11-29 06:09:50 25 4
gpt4 key购买 nike

我喜欢将我的连接和一般转储设置放入变量中,然后像这样将它们提供给 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

有我的 bash 变量:

WHERE="COL > '2016-08-14' AND COL <= '2016-08-15'"
SRC_SQL_OPT="--where=\"${WHERE}\" --opt --single-transaction --skip-triggers --no-create-db --no-create-info ${DB} ${TBL}"

请注意,当我 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'\''' AND COL '<=' ''\''2016-08-15'\''"' --opt --single-transaction --skip-triggers --no-create-db --no-create-info dbase table

注意:现在 --where 选项周围有一堆额外的单引号... How?

最佳答案

$SRC_SQL_OPT 包含以下字符串:

--where="COL > '2016-08-14' AND COL <= '2016-08-15'" --opt --single-transaction --skip-triggers --no-create-db --no-create-info dbase table

mysqldump ${SRC_SRV} ${SRC_SQL_OPT} 中扩展该字符串时,Bash 在其 internal field separator 上将变量拆分为单独的参数.

因为默认情况下,字段分隔符是空格,$SRC_SQL_OPT每次 出现空格时被分割——不管该空格是否出现在引号内。可以通过引用变量来防止 Bash 拆分变量,但由于您实际上希望将该变量拆分到其他地方,因此您需要:

  • 将 where 部分分开(如 @Pianosaurus has said ),例如:

    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

关于mysql - 带有嵌套变量的奇怪 bash 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38952219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com