2010-11-11 153 views
0

我写一个分析日志文件的shell脚本。最重要的部分是这样的:shell脚本双引号

rx=$(echo "$logfile" | grep -o "rx_value.*" | grep -o "[0-9]\{1,10\}") 
echo rx=$rx 

被打印到STDOUT(WRONG)以下:

rx= 

如果删除从$日志文件双qoutes这样的:

rx=$(echo $logfile | grep -o "rx_value.*" | grep -o "[0-9]\{1,10\}") 
echo rx=$rx 

的以下是打印到STDOUT(正确):

rx=0 

我很确定围绕变量使用双引号是一件好事,所以我在脚本中的所有变量上都使用了它们。到目前为止,我已经找到了信息,说如果一个不把周围变量的双引号,结果可能因为分词的错误成了,通配符等

谁能解释这里发生了什么?

编辑:

$日志文件中包含的wget下载日志文件:

$logfile=(wget -q -O -"http://www.example.com") 
+1

是什么'$ logfile'包含哪些内容? – 2010-11-11 21:12:47

+0

这仍然不能回答Ignacio的问题。什么是'$ logfile'内容的例子,而不是“它从哪里来”? – 2010-11-11 21:43:15

回答

0

你没有提到的$logfile值。您的信息是正确的 - 无引号和双引号之间的区别恰恰是字段分裂和匹配。所以,如果你依靠他们中的一个发生,你会得到错误的结果双引号。

UPDATE。好吧,所以你的变量包含一个用wget检索的日志文件。我可以建议使用管道吗?

rx=$(wget -q -O -"http://www.example.com" | 
    grep -o "rx_value.*" | 
    grep -o "[0-9]\{1,10\}") 

但是,这可能会输出相同的,你的双引号的例子,我相信这比你认为的正确答案更多。

+0

我可以尝试做一些测试。 – frank099 2010-11-11 21:45:01

0

如果你引用的输出变量会发生什么?

echo "rx=$rx" 

不这样做往往是“神秘”行为的来源。

+0

这也会打印错误的输出。实际上,回声线仅用于调试,该值在脚本的其他地方使用。 – frank099 2010-11-11 21:29:09

1

我觉得你logfilerx_value和你正在寻找的号码之间的换行符。带有未加引号参数扩展的echo命令会将换行符转换为空格。请参阅文档中的单词拆分或字段拆分。