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
相关产品推荐
相关产品推荐

