Bash脚本循环迭代结果未追加,仅保留最后一次输出问题排查
问题排查与解决
你的脚本仅保留最后一次zgrep执行结果的核心原因,是用for line in $(cat myQueries.txt)读取文件行的方式存在可靠性问题:
- 在
#!/bin/sh环境下,$(cat ...)的输出会按照默认IFS(包含空格、制表符、换行)拆分内容,像你示例中带尾部空格的查询行^dog,会被拆分成多个循环项,大部分无效查询不会返回结果,只有最后一个完整的行查询能输出内容到output.txt。 - 这种写法还会触发文件名扩展(如果查询行包含
*等通配符),进一步导致查询逻辑出错。
修复后的脚本
改用while read循环读取文件行,这是处理文本行的标准可靠写法:
#!/bin/sh while IFS= read -r line; do zgrep -m 1 "$line" dataset.gz >> output.txt done < myQueries.txt
参数说明
IFS=:保留行首尾的空格(你的查询行包含尾部空格,这个设置是关键)-r:禁止反斜杠转义,避免行内的反斜杠被错误解析< myQueries.txt:直接将文件作为read的输入,无需多余的cat命令,更高效
替换后,每一行查询的结果都会正确追加到output.txt中,和你手动执行的结果完全一致。
内容的提问来源于stack exchange,提问作者frogger
相关产品推荐
相关产品推荐

