これは、私が書いた 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) 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, キーワード
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=([^&] )') as keyword, COUNT( ) as count FROM 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, キーワード
ORDER BY は DESC を検索します。"
文字列を分離して "[table.$dir_prefix]" をエコーすると、予想される文字列 [table.20121128] が出力されます。これがより大きな文字列で「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/