【问题标题】:special characters in bash scriptbash脚本中的特殊字符
【发布时间】:2013-06-06 16:01:02
【问题描述】:

我有一个 bash 脚本,其中包含以下行

mysql -uusername -ppassword -e 'UPDATE \'table-name.config\' SET value=1234567890 WHERE action_code=102 AND name=\'last_updated_date\';'

但我明白了

./hybrid_telepath/install: line 856: unexpected EOF while looking for matching `''
./hybrid_telepath/install: line 872: syntax error: unexpected end of file

显然我的角色有问题,并且没有很好地关闭线路。

知道如何在 bash 中执行此操作吗?

如果我把它改成

mysql -uusername -ppassword -e "UPDATE `table-name`.`config` SET value=1312626266 WHERE action_code=102 AND name='last_updated_date';"

我明白了

line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET value=1312626266 WHERE action_code=102 AND name=last_updated_date' at line 1

谢谢

【问题讨论】:

  • 也许你需要双重转义? ... UPDATE \\'table....?
  • 试过了..不起作用:-(
  • 这部分和多个反引号是怎么回事:`table-name`.`config`?为什么不将其保留为“table-name.config”?
  • 根本不使用反引号?改用单引号?

标签: mysql linux bash


【解决方案1】:

转义序列在单引号内不起作用。对最外层的引号使用双引号,然后您不需要转义内的单引号:

mysql -uusername -ppassword -e "UPDATE 'table-name.config' SET value=1234567890 WHERE action_code=102 AND name='last_updated_date';"

【讨论】:

  • 另一种方式:'UPDATE'\''table-name.conf'\'' ......'(即,在' 内,插入单引号:' \' ' (在示例中,它看起来像双引号,因为两个单引号都非常接近)......丑陋,但将 whiole 的东西放在单引号中,因此转义了大多数特殊字符($ 等))
  • 我尝试了你所说的,但我遇到了另一个问题..我更新了我的问题
  • 双引号内的反引号执行反引号内的shell“命令”。如果查询在双引号中,则必须转义这些。或者,保留单引号,但当您需要在查询字符串中使用单引号时,请使用序列'\''。第一个引号结束当前的单引号字符串;反斜杠单引号嵌入单引号;最后的单引号恢复单引号字符串。
【解决方案2】:

之前的海报是正确的。除了使用双引号的建议之外,您可能还想单独开始构建您的 queryString。当您在脚本方面变得更好时(并且希望转向 Python 之类的东西),这种做法将为您提供很好的服务。在脚本中硬编码数据库凭据也是一种不好的做法。请注意,您可以在其他地方(即在另一个脚本中)定义这些值,然后只需获取该脚本即可。这使您的代码模块化。更好的是,编写函数、源代码和重用。这是一个例子:

#!/bin/bash
. /etc/myDbCreds

myQuery="select * from foo where bar ='snafu';"

mysql -u $myUser -p${myPass} -e $myQuery

【讨论】:

  • 您需要用双引号将查询括起来,不是吗?实际上,我会将命令行中的所有变量引用用双引号括起来。
【解决方案3】:

试试这个:

mysql -uusername -ppassword -e "UPDATE \'table-name.config\' SET value=1234567890 WHERE action_code=102 AND name=\'last_updated_date\';"

【讨论】:

    【解决方案4】:

    我有一个关于mysql cmd的-e ""的类似问题。

    这看起来很正常:

    $ mysql -h vip0 -u root -pqwerty -e "show databases;" 
    +--------------------+ 
    | Database           | 
    +--------------------+ 
    | information_schema | 
    | mysql              | 
    | performance_schema | 
    +--------------------+ 
    

    但如果我想通过 ssh 执行它,它不起作用:

    $ ssh g1 --  mysql -hvip0 -uroot -pqwerty -e "show databases;" 
    ERROR 1049 (42000): Unknown database 'databases' 
    

    经测试,我似乎需要逃离这个空间:

    $ ssh g1 --  mysql -hvip0 -uroot -pqwerty -e "show\ databases;" 
    Database 
    information_schema 
    mysql 
    performance_schema
    

    但我不明白为什么......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2014-04-10
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多