Shell脚本双引号

时间:2010-11-11 21:09:57

标签: linux bash quotes

我正在编写一个解析日志文件的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")

3 个答案:

答案 0 :(得分:1)

我认为您的logfilerx_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"

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