这是我编写的bash脚本中的一个查询字符串。
"选择day,xxx,yyy,zzz,if(count>$threshold,keyword,'_other')作为关键字,sum(count)作为搜索来自(选择LEFT(FORMAT_UTC_USEC(UTC_USEC_TO_DAY(时间戳*1000000))、10)作为日,xxx,yyy,zzz,REGEXP_EXTRACT(actiondata,'vq=([^&])')作为关键字,COUNT()作为计数FROM[table.$dir_prefix]WHERE product='myproduct'AND LEFT(FORMAT_UTC_USEC(时间戳*1000000),10)="$1"AND REGEXP_MATCH(操作数据,'vq=')GROUP BY day,xxx,yyy,zzz,关键字)GROUP BY day,xxx,yyy,zzz,关键字
ORDER BY搜索DESC;">
当我回显此字符串时,输出为:
"选择day,xxx,yyy,zzz,if(count>50,keyword,'_other')作为关键字,sum(count)作为搜索来自(选择LEFT(FORMAT_UTC_USEC(UTC_USEC_TO_DAY(时间戳*1000000))、10)作为日,xxx,yyy,zzz,REGEXP_EXTRACT(actiondata,'vq=([^&])')作为关键字,COUNT()作为计数FROM 1WHERE product='myproduct'AND LEFT(FORMAT_UTC_USEC(时间戳*1000000),10)='2012-11-28'AND REGEXP_MATCH(操作数据,'vq=')GROUP BY day,xxx,yyy,zzz,关键字)GROUP BY day,xxx,yyy,zzz,关键字
ORDER BY搜索DESC;">
隔离字符串并回显"[table.$dir_prefix]"输出预期的字符串[table.201128]。有人能解释为什么在较大的字符串中将其求值为'1'吗?
跳过方括号(\[table.$dir_prefix\])并不能解决问题。
更多详细信息:$dir_prefix和$threshold分别设置为20121128和50
字符串设置如下:
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;
解决方案:更多信息
这里有一篇很好的文章,详细介绍了在你不想要的时候防止球化。我选择了set-f选项。
http://blog.edwards-research.com/2011/05/preventing-globbing/
当前目录中有一个名为1
的文件,并且正在对其进行globed处理。
$ touch 1
$ echo [foo.123]
1
$ echo [foo.234]
[foo.234]