【问题标题】:Shell script double quotesShell脚本双引号
【发布时间】:2010-11-11 21:09:57
【问题描述】:

我正在编写一个解析日志文件的 shell 脚本。重要的部分是:

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

以下内容打印到 STDOUT(错误):

rx=

如果我像这样从 $logfile 中删除双引号:

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")

【问题讨论】:

  • $logfile 包含什么内容?
  • 这仍然没有回答伊格纳西奥的问题。 $logfile 的内容是什么而不是“它来自哪里”?

标签: linux bash quotes


【解决方案1】:

我认为您的logfilerx_value 和您要查找的号码之间有一个换行符。带有不带引号的参数扩展的echo 命令会将换行符转换为空格。请参阅文档中的分词或字段拆分。

【讨论】:

    【解决方案2】:

    如果在输出中引用变量会发生什么?

    echo "rx=$rx"
    

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

    【讨论】:

    • 这也会打印错误的输出。实际上 echo 行仅用于调试,该值在脚本的其他地方使用。
    【解决方案3】:

    你没有提到$logfile 的值。您的信息是正确的 - 无引号和双引号之间的区别正是字段拆分和通配符。所以如果你依赖其中一个发生,你会得到错误的结果带有双引号。

    更新。好的,所以您的变量包含使用wget 检索的日志文件。我可以建议改用管道吗?

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

    但这可能会输出与您的双引号示例相同的输出,我会比您认为正确的答案更相信这个。

    【讨论】:

    • 我可以尝试用它做一些测试。