我经常从命令行使用直线,所以我想为直线命令创建一个bash别名,它为我处理所有的样板文件,并进行一些参数解析和其他事情。具体来说,我想做的一件事是创建一个showtables
命令,该命令接受一个参数,即数据库的名称,并使用锅炉板调用直线命令,并将-e参数与适当的SQL一起传递,即-showtables db1
应调用/usr/bin/beeline -u $config -e "SHOW TABLES IN db1"
。我的源文件如下:
/usr/bin/beeline --showHeader=False --outputformat=tsv2 -u $config -e "SHOW TABLES IN $1"
但是输出是
...
Error: Error while compiling statement: FAILED: ParseException line 1:4 cannot recognize input near 'SHOW' '<EOF>' '<EOF>' in ddl statement (state=42000,code=40000)
Error: Error while compiling statement: FAILED: ParseException line 1:0 cannot recognize input near 'TABLES' '<EOF>' '<EOF>' (state=42000,code=40000)
Error: Error while compiling statement: FAILED: ParseException line 1:0 cannot recognize input near 'IN' '<EOF>' '<EOF>' (state=42000,code=40000)
Error: Error while compiling statement: FAILED: ParseException line 1:0 cannot recognize input near 'db1' '<EOF>' '<EOF>' (state=42000,code=40000)
...
我已经验证了,只是做
/usr/bin/beeline --showHeader=False --outputformat=tsv2 -u $config -e "SHOW TABLES IN db1"
如预期工作。我不明白为什么我的可执行文件不能工作。
从解析的角度来看,引号前面的反斜杠使它们表现得像常规字符,不再像引号。因此,当您将反斜杠放在引号前面时,SHOW TABLES IN db1
不再是一个字符串,而是四个独立的字符串:"SHOW
、TABLES
、IN
和db1"
。
这些单词在单独运行时是无效的查询,因此会出现错误。去掉反斜杠,问题就消失了。