在Bash中,如何将需要使用反引号的命令作为参数传递?

3

我有一个像下面这样的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')"

我仍然遇到了相同的错误。
2个回答

4

在双引号内,反引号被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 中使用它是更好的命令替换方式。因此您会得到与之前相同的错误。


相关文章:


0

在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`

1
一个命令或参数中可以混合多种引用类型。echo 'it is now`'"$(date)"'`'是完全有效的:反引号是字面量,因为它们在单引号中,$()被扩展,因为它在双引号中。 - Charles Duffy
很好的观点。Bash语法是...惊人的。(巴洛克?)(奇怪?) - A. L. Flanagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接