我有一个 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