如何在Bash中读取含分隔符的文件并生成数组输出?
问题修正与解决方案
原代码的核心问题
- 变量名不一致:输入的ID存在
id1变量里,但后续全程用$id,导致所有操作都拿不到正确数据 - 循环变量
loop未初始化,自增写法$loop++不符合bash语法 - 条件判断语法错误:
[$loop == 0]的括号前后必须加空格,数值比较要用-eq(或双括号((...))) - 数组构建错误:用
tr拆分后赋值的不是bash数组,没法按索引直接取元素 - 未处理查询不到用户的情况,会导致空输出
修正后的代码
#!/bin/bash show_details() { echo "Search Patron Details" echo -n "Enter Patron ID: " read -r id # 查找匹配的行,保存到变量 matched_line=$(grep -i "^$id:" patron.txt) if [ -z "$matched_line" ]; then echo "No patron found with ID: $id" return fi # 用冒号分隔,将内容存入数组 IFS=: read -r -a patron_array <<< "$matched_line" # 用printf格式化输出(也可以用echo,printf更易控制格式) printf "Fullname (auto display): %s\n" "${patron_array[1]}" printf "Contact Number (auto display): %s\n" "${patron_array[2]}" printf "Email Address (auto display): %s\n" "${patron_array[3]}" # 询问是否继续查询 while true; do echo -n "Search another patron? (y)es or (q)uit: " read -r choice case $choice in y|Y) show_details; return;; q|Q) exit 0;; *) echo "Invalid input! Please enter y or q.";; esac done } # 启动函数 show_details
关键说明
- 变量统一:全程用
id存储输入的ID,避免变量名混乱 - 正确构建数组:用
IFS=: read -r -a array <<< "$line"将匹配到的行按冒号拆分成真正的bash数组,数组索引从0开始(0是ID,1是姓名,以此类推) - printf的用法:
printf "格式字符串" 变量,比如printf "Fullname: %s\n" "${patron_array[1]}",%s会被后面的变量值替换,\n是换行符,输出更整齐 - 错误处理:判断
matched_line是否为空,为空则提示未找到用户 - 循环询问逻辑:将查询功能封装成函数,选择
y时重新调用函数,q时退出,逻辑更清晰
内容的提问来源于stack exchange,提问作者Gerald Loo
相关产品推荐
相关产品推荐

