【问题标题】:Using a command that needs backticks to be passed as part of an argument in bash使用需要反引号作为 bash 中参数的一部分传递的命令
【发布时间】:2018-01-31 21:56:15
【问题描述】:

我有一个bash 脚本,如下所示。在table 变量附近,我想在脚本中使用反引号。

#!/bin/bash

[ $# -ne 2 ] && { echo "Usage : $0  database table "; exit 1; }

database=$1
table=$2

hive -e "alter table ${database}.`${table}` SET TBLPROPERTIES('EXTERNAL'='FALSE')"

上面的脚本给了我下面的错误

script.sh: line 10: table: command not found

但是如果我不在表变量附近使用反引号,那么脚本可以正常工作。

但我需要在 table 变量附近添加反引号。我该怎么做?

我也尝试过如下方式

hive -e "alter table ${database}.$(table) SET TBLPROPERTIES('EXTERNAL'='FALSE')"

我仍然遇到同样的错误。

【问题讨论】:

    标签: linux bash hive escaping


    【解决方案1】:

    在双引号内,反引号被 shell 解释,导致 table 被视为命令。你需要逃避它们:

    hive -e "alter table ${database}.\`${table}\` SET TBLPROPERTIES('EXTERNAL'='FALSE')"
    

    或者,您可以使用变量来保存反引号:

    bt="\`"
    hive -e "alter table ${database}.$bt${table}$bt SET TBLPROPERTIES('EXTERNAL'='FALSE')"
    

    第二个命令的问题

    hive -e "alter table ${database}.$(table) SET TBLPROPERTIES('EXTERNAL'='FALSE')"
    

    构造 $(table) 的工作方式与反引号内的 table 相同 - 它只是在 Bash 中进行命令替换的更好方法。因此,您会遇到与之前相同的错误。


    相关帖子:

    【讨论】:

      【解决方案2】:

      BASH(和其他 shell)中的反引号导致反引号内的字符串作为程序运行。然后将程序的输出粘贴到命令中以代替反引号。

      $ echo "it is now `date`"
      it is now Wed Jan 31 17:01:28 EST 2018
      

      一种解决方案是使用单引号而不是双引号:

      $ echo 'it is now `date`'
      it is now `date`
      

      但是,在您的命令中,您希望对 ${database} 之类的值进行评估,而单引号也可以防止这种评估。所以最好的办法是使用反斜杠来转义反引号:

      $ echo "it is now \`date\`"
      it is now `date`
      

      【讨论】:

      • 可以在单个命令或参数中混合多种引用类型。 echo 'it is now`'"$(date)"'`' 完全有效:反引号是文字,因为它们在单引号中,$() 被扩展,因为它在双引号中。
      • 好点。 Bash 语法是……惊人的。 (巴洛克?)(奇怪?)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多