Bash行字段拆分场景下如何在for循环中给t赋值动态索引的数组元素
Bash文本行字段拆分代码修改方案
原代码核心问题
- 读取文件的
read参数配置错误:-d '\n'会让read遇到第一行换行就终止读取,仅能拿到第一行内容 - 数组遍历边界错误:Bash数组下标从0开始,最大有效下标为
${#lines[@]}-1,原逻辑j<=$len会访问不存在的数组元素 - 数组元素取值语法错误且索引硬编码:Bash获取数组指定索引元素的语法为
${数组名[下标]},原代码写死lines[0]无法实现动态索引取值 - 字段拆分行缺少注释标记
#,且用tr拆分的方式兼容性较差,遇到特殊字符容易出错
修改后的可运行代码(推荐版,兼容性更好)
# 读取input.txt所有行存入lines数组,保留行首尾空白 IFS=$'\n' read -d '' -r -a lines < input.txt len=${#lines[@]} # 遍历所有有效数组索引 for ((j=0;j<len;j++)); do # 动态获取当前索引j对应的行内容 t=${lines[j]} # 按空格拆分前两个字段存入数组,避免子进程开销和特殊字符异常 read -r field1 field2 <<< "$t" a=("$field1" "$field2") # 遍历输出两个字段 for i in 0 1 do echo "${a[i]}" done done
保留原tr写法的最小修改版
如果你需要保留原有tr拆分的逻辑,仅修正错误的最小修改代码如下:
# 修正read参数,读取所有行存入数组 IFS=$'\n' read -d '' -r -a lines < input.txt len=${#lines[@]} # 修正遍历边界 for ((j=0;j<len;j++)); do # 修正数组取值语法,使用动态索引j t=${lines[j]} # 补全注释标记# a=($(echo "$t" | tr ' ' '\n')) # split the first and 2nd field into another array of 2 values for i in 0 1 do echo "${a[i]}" done done
内容的提问来源于stack exchange,提问作者Peace
相关产品推荐
相关产品推荐

