linux—使用需要backticks作为bash参数的一部分传递的命令

vlf7wbxs  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(302)

我有一个 bash 脚本如下。近 table 变量,我想在脚本中使用backticks。


# !/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

但是如果在表变量附近不使用backticks,那么脚本就可以正常工作。
但我需要在附近有背虱 table 变量。我该怎么做?
我也试过下面这种方法

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

我还是犯了同样的错误。

cl25kdpy

cl25kdpy1#

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

$ 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`
b91juud3

b91juud32#

在双引号中,反勾号由shell解释,导致 table 被当作命令对待。你需要逃离他们:

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

或者,可以使用一个变量来保留backticks:

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 在backticks内部-这只是在bash中进行命令替换的更好方法。因此,您将得到与前面相同的错误。
相关岗位:
bash中单引号和双引号的区别
在shell脚本中使用$()而不是反勾号有什么好处?

相关问题