0

这是我编写的 bash 脚本中的查询字符串。

"SELECT day,xxx,yyy,zzz,if(count>$threshold,keyword,'_other') 作为关键字,sum(count) 作为搜索 FROM (SELECT LEFT(FORMAT_UTC_USEC(UTC_USEC_TO_DAY(timestamp*1000000)),10) 作为day, xxx, yyy, zzz, REGEXP_EXTRACT(actiondata,'wvq=([^&] )') 作为关键字,COUNT( ) 作为计数 来自 [table.$dir_prefix] WHERE product='myproduct' AND LEFT(FORMAT_UTC_USEC(timestamp *1000000),10) = '$1' AND REGEXP_MATCH(actiondata,'wvq=') GROUP BY day,xxx, yyy,zzz,keyword ) GROUP BY day,xxx,yyy,zzz,keyword

ORDER BY 搜索 DESC;"


当我回显这个字符串时,输出是:

"SELECT day,xxx,yyy,zzz,if(count>50,keyword,'_other') 作为关键字,sum(count) 作为搜索 FROM (SELECT LEFT(FORMAT_UTC_USEC(UTC_USEC_TO_DAY(timestamp*1000000)),10) 作为天, xxx, yyy, zzz, REGEXP_EXTRACT(actiondata,'wvq=([^&] )') 作为关键字,COUNT( ) 作为计数 从 1 WHERE product='myproduct' AND LEFT(FORMAT_UTC_USEC(timestamp*1000000),10) = '2012-11-28' AND REGEXP_MATCH(actiondata,'wvq=') GROUP BY day,xxx, yyy,zzz,keyword ) GROUP BY day,xxx,yyy,zzz,keyword

ORDER BY 搜索 DESC;"


隔离字符串并回显“[table.$dir_prefix]”输出预期的字符串 [table.20121128]。谁能解释为什么在较大的字符串中将其评估为“1”?

转义方括号 (\[table.$dir_prefix\]) 并不能解决问题。

更多细节: $dir_prefix 和 $threshold 分别设置为2012112850
字符串设置如下:

to_echo=\
"SELECT day,xxx,yyy,zzz,if(count>$threshold,keyword,'_other') as keyword, sum(count) as searches FROM (SELECT LEFT(FORMAT_UTC_USEC(UTC_USEC_TO_DAY(timestamp*1000000)),10) as day, xxx, yyy, zzz, REGEXP_EXTRACT(actiondata,'wvq=([^&])') as keyword, COUNT() as count FROM [table.$dir_prefix] WHERE product='myproduct' AND LEFT(FORMAT_UTC_USEC(timestamp*1000000),10) = '$1' AND REGEXP_MATCH(actiondata,'wvq=') GROUP BY day,xxx, yyy,zzz,keyword ) GROUP BY day,xxx,yyy,zzz, keyword

ORDER BY searches DESC;"

更新 2

该脚本仅在此特定服务器(运行 Ubuntu)上存在问题。我的另一台服务器(运行 Redhat)没有问题并输出预期的内容。它必须与配置相关。我可以解决它,但我真的只想知道这背后的原因。

这是确切的脚本:

#!/bin/bash

dir_prefix=`date --date "$1" +%Y%m%d`;
threshold=$2;

query="SELECT day,xxx,yyy,zzz,if(count>$threshold,keyword,'_other') as keyword, sum(count) as searches FROM (SELECT LEFT(FORMAT_UTC_USEC(UTC_USEC_TO_DAY(timestamp*1000000)),10) as day, xxx, yyy, zzz, REGEXP_EXTRACT(actiondata,'wvq=([^&])') as keyword, COUNT() as count FROM [table.$dir_prefix] WHERE product='myproduct' AND LEFT(FORMAT_UTC_USEC(timestamp*1000000),10) = '$1' AND REGEXP_MATCH(actiondata,'wvq=') GROUP BY day,xxx, yyy,zzz,keyword ) GROUP BY day,xxx,yyy,zzz, keyword

ORDER BY searches DESC;"

echo $query;

解决方案:更多信息

这是一篇很好的文章,详细介绍了在您不想要的情况下防止出现 globbing。我选择了 set -f 选项。

http://blog.edwards-research.com/2011/05/preventing-globbing/

4

1 回答 1

1

您有一个1在当前目录中命名的文件,并且它正在被全局化。

$ touch 1
$ echo [foo.123]
1
$ echo [foo.234]
[foo.234]
于 2012-12-05T19:20:03.477 回答