【问题标题】:Escape single quote inside single quote inside double quote在双引号内转义单引号内的单引号
【发布时间】:2019-12-05 10:16:09
【问题描述】:

我正在尝试通过 bash 脚本在远程服务器上运行查询。问题是,我必须在已经有单引号的查询中使用单引号。

我的代码:

# note: $line has ` in it, as this is a SQL query
ssh server "mysql --defaults-extra-file=$SQL_CREDS_FILE $R_DB $t -e '$line INTO OUTFILE \"\'\"$DIR/$tbl_count.csv\"\'\" FIELDS TERMINATED BY \"\'\",\"\'\" ENCLOSED BY \"\'\"\"\'\" LINES TERMINATED BY \"\'\"\n\"\'\"'"

我在运行此代码时看到的错误:

bash: -c: line 0: unexpected EOF while looking for matching `"'
bash: -c: line 1: syntax error: unexpected end of file

MYSQL 查询示例:

mysql -u user -pPassword database -e 'select `id`,`title`,`name`,`description`,`icon`,`creation_date` as `created_at`,`mutation_date` as `created_at` from achievement;'

【问题讨论】:

  • $line 中的 ` 字符是否被转义?我认为它可能会解决问题。
  • @vicraj 用\` 尝试过,但不幸的是没有运气。
  • 命令周围的$(...) 是错误的,除非您特别希望ssh 命令返回一个应该在本地评估的命令(这反过来看起来是一个非常危险的结构;但实际上,我不敢相信这就是你想要的)。
  • 我试图发布一个答案,但很难猜出你期望最终执行什么命令。您能否请edit您的问题显示应该执行的确切命令,以及您希望所有这些变量设置为的内容。
  • 你能在不转义的情况下发布代码吗? 有效的东西。前任。 mysql 命令有效但不是在单行中执行,而是通过键入 ssh 会话来执行。或者INTO OUTFILE 在 mysql 会话中键入时起作用的部分。

标签: bash quotes double-quotes single-quotes


【解决方案1】:

最简单的解决方法是使用完全不引用表达式的上下文。

使用此处的文档会占用ssh 的标准输入,但在这种情况下,它似乎可以接受(或者甚至是可取的)。

ssh server <<____HERE
# Guessing $R_DB contains "database"
# Guessing $t contains your credentials ...?
# Guessing $DIR contains a directory name
# Guessing $tbl_count contains a file name
# Guessing $line contains your actual query  
mysql "$R_DB" $t -e "${line//\`/\\\`} INTO OUTFILE '$DIR/$tbl_count.csv'
    FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n'"
____HERE

参数扩展${line//\`/\\\`} 是一个仅限 Bash 的功能,因此这取决于远程 shell 是 Bash。

【讨论】:

    【解决方案2】:

    @KamilCuk 发表评论后,我开始思考转义字符并在没有 SSH 的情况下运行代码。

    我已将代码重写为仅包含 "' 导致:

    ssh server "mysql --defaults-extra-file=$SQL_CREDS_FILE $R_DB -e \"$line INTO OUTFILE '$DIR/$tbl_count.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n'\"" < /dev/null
    

    同时删除 ` 帮助,因为该字符之间的任何内容都将作为命令执行。

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多