使用 bash 循环文件中的行并传递给变量。结果变量与文件的值不同,为什么?

使用 bash 循环文件中的行并传递给变量。结果变量与文件的值不同,为什么?

我有一个 bash 脚本(只是做一些简单的日志文件模式匹配),我已经在 cron 中运行了几年。最近它坏了并开始返回奇怪的结果。在深入研究脚本并对其进行一些调试后,我发现问题似乎出在我对文件执行的 while 循环上。

为了说明这个问题,我对文件“cat /var/tmp/file”执行了 cat 操作,并得到了我期望得到的时间戳和一些(未格式化的)ID:

15:56:14,965 [,PCC12345678(PSI12345678),,]
18:08:43,706 [,PCC23456789(PSI23456789),,]
12:01:49,233 [,PCC34567891(PSI34567891),,]

当我将其放入 while 循环中时,我希望它保持不变,但事实并非如此。当我在循环中回显该行时,第二个字段(ID)始终更改为“1”,如下所示:

cat /var/tmp/file | while read line
do
echo $line
done

它给我的输出是:

15:56:14,965 1
18:08:43,706 1
12:01:49,233 1

这显然与文件中的内容完全不同,这让我感到困惑。

到目前为止我尝试过的事情:

  • 我想也许 $line 变量卡在内存中,所以尝试清除它,但没有成功。
  • 由于缺乏更好的想法,我尝试对服务器进行经典的“关闭并再次打开”,认为也许它可以清除可能卡住的任何内容。
  • 尝试在另外两台服务器上运行该脚本,遇到了同样的问题。

目前我在想也许它不喜欢文件的格式,可能与方括号或逗号有关。尽管我不确定为什么会这样,或者为什么会突然发生。

注意:自编写以来,脚本或其运行所针对的日志文件没有任何变化。它之前已经工作了两年。

编辑:根据建议,我检查了环境中可能发生的变化,据我所知,情况是一样的。除非操作系统升级发生了变化(我不知道如何检查):

  • .bash_profile 和 .profile 已经三年多没有被编辑过。
  • 我尝试在其他 shell ksh、bash、csh 中运行该脚本。他们所有人都遇到了同样的问题。
  • 我尝试过与其他用户(包括 root)一起运行该脚本。他们所有人又遇到同样的问题。

谢谢马特

答案1

1您有一个在脚本运行的目录中命名的文件。

作为梅尔·布尔斯兰注释,[]对于 shell 有特殊的含义,但它与正则表达式没有太大关系:它只是意味着“从括号之间的任何字符获取的单个字符”。所以当你跑步时

echo 15:56:14,965 [,PCC12345678(PSI12345678),,]

shell 查找名为,, or P, or C, or 1... 的文件,如果至少有一个文件匹配,则[,PCC12345678(PSI12345678),,]替换为输出中所有匹配的文件名;否则将按原样复制。

如果删除该1文件,应恢复旧行为。您可以通过保护来修复脚本$line

cat /var/tmp/file | while read line
do
echo "$line"
done

相关内容