bash 中较大的双引号字符串中的"[table.20121128]"在我回显时计算结果为 "1"



这是我编写的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分别设置为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;

解决方案:更多信息

这里有一篇很好的文章,详细介绍了在你不想要的时候防止球化。我选择了set-f选项。

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

当前目录中有一个名为1的文件,并且正在对其进行globed处理。

$ touch 1
$ echo [foo.123]
1
$ echo [foo.234]
[foo.234]

相关内容

  • 没有找到相关文章

最新更新