我有一个 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')"
我还是犯了同样的错误。
2条答案
按热度按时间cl25kdpy1#
bash(和其他shell)中的backticks导致backticks中的字符串作为程序运行。然后将程序的输出粘贴到命令中以代替反记号。
一种解决方案是使用单引号而不是双引号:
但是,在命令中,您希望对${database}之类的值进行求值,单引号也会阻止这种求值。所以最好的办法是使用反斜杠来避开反斜杠:
b91juud32#
在双引号中,反勾号由shell解释,导致
table
被当作命令对待。你需要逃离他们:或者,可以使用一个变量来保留backticks:
你第二个命令的问题
那是构造吗
$(table)
工作方式与table
在backticks内部-这只是在bash中进行命令替换的更好方法。因此,您将得到与前面相同的错误。相关岗位:
bash中单引号和双引号的区别
在shell脚本中使用$()而不是反勾号有什么好处?