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

Shell脚本校验学生提交压缩文件出现SC2193报错求修正方案

问题根因说明

你触发SC2193警告的核心原因是字符串提取逻辑完全不符合Shell语法规范:你写的"$j | $(awk -F '.' '{print $2}' ~/compressed_files)"实际运行时会生成类似A00002.dika | dika zip rar tar.gz的拼接字符串,永远不可能等于dika,才会触发该警告。

除此之外你的原有代码还存在几个核心逻辑问题:

  • 管道符|不能直接写在字符串比较语句中,提取单个文件名的前后缀不需要调用awk,用Shell内置的参数扩展即可实现,性能更高
  • 嵌套循环逻辑错误:每遍历一个压缩文件就执行一次else分支,会导致missing_list中出现大量重复学号
  • 用ls -l | awk取文件名的写法不规范,容易受文件名格式影响出错,直接用通配符遍历目录即可
  • 没有处理多后缀文件(比如.tar.gz)的识别逻辑,按照需求只要后缀不是.dika就算合规,直接判断完整后缀即可

修正后代码(保留嵌套循环的实现思路)

#!/bin/bash
# 清空/初始化结果文件,避免历史数据干扰
> ~/missing_list
> ~/wrong_list

# 遍历所有学号,用while read比for遍历更稳定
while IFS= read -r i || [[ -n "$i" ]]; do
    found=0
    is_wrong=0
    # 遍历compressed_files下的所有文件
    for j in ~/compressed_files/*; do
        # 取纯文件名(去掉路径前缀)
        filename=$(basename "$j")
        # 提取学号前缀(第一个.之前的所有内容)
        prefix=${filename%%.*}
        # 提取后缀(第一个.之后的所有内容,适配.tar.gz这类多后缀场景)
        ext=${filename#*.}
        
        # 匹配到对应学号的文件
        if [[ "$prefix" == "$i" ]]; then
            found=1
            # 判断是否是错误的dika格式
            [[ "$ext" == "dika" ]] && is_wrong=1
            break # 匹配到直接跳出内层循环,减少不必要的遍历
        fi
    done

    # 根据匹配结果写入对应文件
    if [[ $found -eq 0 ]]; then
        echo "$i" >> ~/missing_list
    elif [[ $is_wrong -eq 1 ]]; then
        echo "$i" >> ~/wrong_list
    fi
done < ~/student_id

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:54:02