我想我在grep中发现了一个错误。如果我在命令行上对db日志运行这个grep语句,它运行正常。
grep "Query Executed in [[:digit:]]\{5\}.\?" db.log
我得到了这个结果:
查询在19699.188 ms执行;“select / * from xyztable .....
当我在脚本中运行它时
LONG_QUERY=`grep "Query Executed in [[:digit:]]\{5\}.\?" db.log`
结果中的星号将替换为当前目录中所有文件的列表。
echo $LONG_QUERY
结果:
查询于19699.188 ms执行; “从/ xyztable中选择不同的
<list of files in current directory>
.....
有没有人见过这种行为?
答案 0 :(得分:2)
这不是grep中的错误。在理解如何解释脚本时,这是一个错误。
如果我写一个剧本:
echo *
我将得到一个文件名列表,因为shell(不是grep,而是/ bin / bash或/ bin / sh或你使用的任何shell)解释了一个未加引号的,未转义的星号作为替换文件名匹配的请求模式&#39; *&#39;,也就是所有这些。
如果我写一个剧本:
echo "*"
我会得到一个&#39; *&#39;,因为它是在带引号的字符串中。
如果我写:
STAR="*"
echo $STAR
我会再次获取文件名,因为我在将它分配给变量时引用了星号,但是当我将变量替换为命令时它变得不加引号。
如果我写:
STAR="*"
echo "$STAR"
我会得到一颗星,因为双引号允许变量插值。
您正在使用反引号 - 即命令周围的`字符。这会将命令的输出捕获到变量中。
我建议如果你要回显命令的结果,而不是其他的,你应该只是将结果重定向到一个文件。 (毕竟,当你的LONG_QUERY包含10,000行输出因为你的日志文件真的满了,你打算做什么?)
除此之外,至少做echo "$LONG_QUERY"
(双引号)。