基于data.txt学生成绩表编写多分支Shell脚本info.sh的实现求助
info.sh 脚本完整实现方案
原参考代码存在逻辑疏漏:错误将数据文件首行判定为表头并跳过,会丢失第一条学生记录的统计,实际实现时需替换为自定义固定表头,不依赖数据文件的表头结构。
核心分流逻辑
在shell层先对传入参数做前置判断,不同分支对应不同的awk处理规则,避免全量循环带来的性能损耗:
- 若参数个数大于1:直接输出错误提示,终止脚本运行
- 若参数个数为0:进入全量成绩统计分支
- 若参数个数为1:先判断参数是否为纯数字,是则按学生ID匹配,否则按学生名/姓匹配
完整脚本代码
将以下内容保存为info.sh:
#!/bin/bash # 配置数据文件路径 DATA_FILE="data.txt" # 分支1:参数数量超过1,输出错误 if [ $# -gt 1 ]; then echo "错误:仅支持最多传入1个参数" exit 1 fi # 分支2:无参数运行,输出所有学生的名、姓、三门课平均分 if [ $# -eq 0 ]; then awk ' # 打印固定表头 BEGIN { print "First Name Last Name Average" } { sum = 0 # 从第4列开始累加3门科目成绩 for(i=4; i<=NF; i++) { sum += $i } print $2, $3, (sum/3) }' "$DATA_FILE" exit 0 fi # 分支3:处理单参数场景 INPUT=$1 # 判断参数是否为纯数字 if [[ $INPUT =~ ^[0-9]+$ ]]; then # 数字参数:匹配学生ID awk -v target_id="$INPUT" ' BEGIN { is_match = 0 } { if ($1 == target_id) { sum = 0 for(i=4; i<=NF; i++) { sum += $i } # 输出匹配学生的ID、名、姓、平均分 print $1, $2, $3, (sum/3) is_match = 1 } } END { if (is_match == 0) { print "未找到ID为 " target_id " 的学生记录" } }' "$DATA_FILE" else # 非数字参数:匹配名或姓,输出对应学生ID awk -v target_name="$INPUT" ' BEGIN { is_match = 0 } { if ($2 == target_name || $3 == target_name) { print $1 is_match = 1 } } END { if (is_match == 0) { print "未找到姓名匹配 " target_name " 的学生记录" } }' "$DATA_FILE" fi
场景测试示例
- 无参数运行:执行
./info.sh
输出参考:First Name Last Name Average ram sen 13 sam gupta 23 jamie any 13 nancy rohila 15.3333 - 传入数字ID参数:执行
./info.sh 121
输出参考:121 jamie any 13 - 传入姓名参数:执行
./info.sh sen
输出参考:101 - 传入多参数:执行
./info.sh 121 sen
输出参考:错误:仅支持最多传入1个参数
注意事项
- 脚本运行前需添加执行权限:
chmod +x info.sh - 需将
data.txt文件放在与脚本相同的工作目录下,若路径不同可修改脚本中DATA_FILE变量为实际文件的绝对路径 - 当前为精确匹配逻辑,如需支持模糊搜索,可将awk中的等值判断替换为正则匹配规则
内容的提问来源于stack exchange,提问作者jitendra raj
相关产品推荐
相关产品推荐

