Shell 在查询中引用变量时导致错误

Shell 在查询中引用变量时导致错误

我正在 shell 中执行查询来访问Google Bigquery表。无法找出导致错误的原因。

#!/bin/bash

file_path='/home/vikrant_singh_rana/test_bq_file.csv'

{
    read
    while IFS=, read -r name local_unit region_unit
    do
        test_tablename=XYZ_KLM_${name}
        echo $test_tablename
        bq query --format=pretty --use_legacy_sql=false --project_id='test-data-project' "select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM `${project_id}.Test_INGEST.${test_tablename}` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"
    done
} < $file_path

以下是要读取的输入文件:

vikrant_singh_rana@cloudshell:~$ cat test_bq_file.csv
name,local_unit,region_unit
AAAAA,hour,cell
BBBBB,15min,cell

错误是:

read_bq_table.sh: line 22: .Test_INGEST.XYZ_KLM_AAAAA: command not found
Error in query string: Error processing job 'test-data-project:bqjob_r54dd3bbd143fcd42_0000017667292a54_1': Syntax error: Unexpected keyword WHERE at [1:81]

答案1

在双引号字符串中

"select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM `${project_id}.Test_INGEST.${test_tablename}` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"

这部分

`${project_id}.Test_INGEST.${test_tablename}`

将被 shell 视为命令替换。发生这种情况是因为反引号在不带引号或在双引号字符串内出现时会引入命令替换。 shell 将展开反引号内的变量并尝试将结果作为命令执行,其方式类似于它所说的

$(${project_id}.Test_INGEST.${test_tablename})

`...`通过在或中执行命令产生的输出$(...)将取代命令替换,至少如果它是故意使用有意义的命令完成的。在您的情况下,反引号是数据库语法的一部分,必须作为文字反引号传递,而不会让 shell 尝试用它们做它的事情。

如果您希望反引号是字面意思,请考虑引用它们:

"select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM \`$project_id.Test_INGEST.$test_tablename\` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"

我还删除了变量名称周围不必要的花括号。

理想情况下,您还可以在将变量值注入数据库之前对其进行清理。您至少应该检测并拒绝包含反引号的字符串。

另请注意,您显示的代码似乎没有为变量设置值(这就是为什么错误消息中project_id字符串的这一部分 before为空)。.Test_INGEST

相关内容