You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell for循环遍历txt文件生成匹配行输出文件脚本报错求助

脚本问题修复说明

你的脚本存在多处语法和逻辑错误,逐一修正后即可正常运行,核心错误点如下:

  • 解释器不匹配:脚本开头指定#!/bin/sh,但使用了bash专属的[[ ]]正则匹配语法,sh环境无法执行
  • 正则匹配语法错误:[[ ]]结构中运算符、变量前后必须加空格,且匹配顺序是[[ 待匹配内容 =~ 正则规则 ]],原脚本写反了匹配顺序、漏了必填空格
  • 输入重定向缺失:while read循环没有绑定要读取的目标文件,根本读不到txt文件的内容
  • 逻辑笔误:失败分支的匹配对象误写为$,实际应该匹配当前行$line
  • 算术运算语法错误:shell中自增运算必须放在(( ))算术运算结构中,直接写count_success++无法执行
  • 遍历范围错误:原循环遍历目录下所有内容,没有过滤.txt后缀,会把子目录、其他格式文件也纳入处理
  • 输出文件名异常:直接拼接完整路径生成输出文件名,会因为路径带/导致文件名非法、输出文件位置混乱
  • 冗余转义问题:正则规则中多余的转义符会导致匹配失效
  • 重复写入问题:没有提前清空历史输出文件,多次运行会重复追加历史内容
  • 冗余内容:脚本末尾多余的~是vim类编辑器的行尾残留标记,运行时会被识别为不存在的命令,需要删除
修复后可直接运行的代码
#!/bin/bash
# 编译结果统计脚本

# 定义匹配正则,移除多余转义
success="Compiling\s\".*\"\s-\sSucceeded"
failure="Compiling\s\".*\"\s-\sFailed"
count_success=0
count_failure=0
# 指定报告目录,仅遍历.txt后缀文件
report_dir=~/Documents/reports
for file in "$report_dir"/*.txt; do
    # 跳过目录下无txt文件时的通配符异常
    [ -e "$file" ] || continue
    # 提取纯文件名生成输出路径,默认输出到当前执行目录
    filename=$(basename "$file")
    output_file="./output_${filename}"
    # 提前清空历史输出内容
    > "$output_file"
    # 逐行读取当前文件内容
    while read -r line; do
        # 匹配编译成功行
        if [[ $line =~ $success ]]; then
            echo "$line" >> "$output_file"
            ((count_success++))
        # 匹配编译失败行
        elif [[ $line =~ $failure ]]; then
            echo "$line" >> "$output_file"
            ((count_failure++))
        fi
    done < "$file" # 将当前文件绑定为while循环的输入源
done

# 输出最终统计结果
echo "$count_success of jobs ran successfully"
echo "$count_failure of jobs didn't work"
使用注意事项
  • 运行前先给脚本加执行权限:执行chmod +x 你的脚本文件名.sh后再启动
  • 如果需要把输出文件和原报告文件存在同一目录,把output_file的定义修改为"$report_dir/output_${filename}"即可
  • 正则规则可以根据实际日志格式微调,如果日志中关键字前后有其他固定标识,直接修改对应正则变量的取值即可

内容的提问来源于stack exchange,提问作者jlaralopez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:45:33