Bash将文件每行存入数组时空值替换为unknown的脚本问题排查
错误原因排查
你的脚本存在3个核心问题,导致空值替换逻辑完全不生效:
- 数组读取参数缺失:
readarray默认会保留每行末尾的换行符,即便是文件里的空行,存入数组后元素值是换行符而非空字符串,-z空值判断会直接失效。 - 循环逻辑错误:
for i in "${data[@]}"遍历得到的i是数组的元素内容,不是数组索引,后续用i当索引去定位数组元素完全错位。 - 数组取值语法错误:Bash中访问数组指定索引的元素必须使用
${数组名[索引]}的格式,你写的$data[i]没有加外层大括号,Bash会把它解析为「普通变量$data的值拼接字符串[i]」,根本取不到对应位置的数组元素。
修正方案
修正后的完整脚本如下:
# 读取文件每行到数组,-t参数自动移除每行末尾的换行符 readarray -t data < data.txt # 遍历数组的所有索引(${!data[@]}是固定写法,用于获取数组所有下标) for i in "${!data[@]}"; do # 正确读取对应索引的元素,判断是否为空 if [ -z "${data[$i]}" ]; then # 空元素替换为unknown data[$i]="unknown" fi done # 取索引1的元素(对应文件第二行)赋值 Author=${data[1]} echo "author: $Author"
执行结果
运行修正后的脚本,会输出符合预期的结果:
author: unknown
内容的提问来源于stack exchange,提问作者koahv
相关产品推荐
相关产品推荐

