我正在编写一个解析日志文件的shell脚本。重要的是这个:
rx=$(echo "$logfile" | grep -o "rx_value.*" | grep -o "[0-9]\{1,10\}")
echo rx=$rx
以下内容打印到STDOUT(错误):
rx=
如果我从$ logfile中删除双qoutes:
rx=$(echo $logfile | grep -o "rx_value.*" | grep -o "[0-9]\{1,10\}")
echo rx=$rx
以下内容打印到STDOUT(正确):
rx=0
我很确定在变量周围使用双引号是一件好事,所以我在脚本中的所有变量上使用它们。我到目前为止所发现的信息表示,如果不在变量周围加上双引号,结果可能因为分词,全局等而变得错误。
有谁可以解释这里发生的事情?
编辑:
$ logfile包含使用wget:
下载的日志文件$logfile=(wget -q -O -"http://www.example.com")
答案 0 :(得分:1)
我认为您的logfile
在rx_value
和您要查找的号码之间有换行符。带有不带引号的参数扩展的echo
命令会将换行符转换为空格。请参阅文档中的单词拆分或字段拆分。
答案 1 :(得分:0)
你没有提到$logfile
的价值。您的信息是正确的 - 没有引号和双引号之间的区别恰恰是字段拆分和通配。因此,如果你依赖其中一个发生,你将得到错误的结果 with 双引号。
<强>更新即可。好的,所以你的变量包含了一个用wget
检索的日志文件。我建议使用管道吗?
rx=$(wget -q -O -"http://www.example.com" |
grep -o "rx_value.*" |
grep -o "[0-9]\{1,10\}")
但是这可能会输出与双引号示例相同的内容,而且我相信这比你认为正确答案的更多。
答案 2 :(得分:0)
如果在输出中引用变量会怎样?
echo "rx=$rx"
不这样做通常是“神秘”行为的来源。