Bash数组元素echo无输出问题及4位比特重映射需求
问题分析与解决
1. 数组拆分失败的原因
你用read -ra din <<< $1拆分字符串时,read默认按IFS(空格、制表符、换行)分割输入。而$1是连续的4位二进制字符串(比如0101),没有分隔符,所以整个字符串会被作为数组的第一个元素(din[0]),数组长度为1,自然din[1]为空。你看到的${#din}输出为4是误解——实际${#din}是数组元素个数,你应该用${#din[0]}查看第一个元素的长度。
2. 正确拆分字符串为字符数组的方法
要把连续字符串拆成单个字符的数组,有两种简单方法:
方法1:遍历字符串索引
function remap { local input="$1" local -a din=() # 遍历每个字符,存入数组 for ((i=0; i<${#input}; i++)); do din[i]=${input:i:1} done # 验证数组(可删除) echo "数组长度:${#din[@]}" echo "索引1的元素:${din[1]}" echo "所有元素:${din[*]}" # 执行重映射逻辑 # 规则:比特0→比特3,比特1→比特2,比特3→比特1,比特2→比特0 # 假设输入字符串左到右为 比特3、比特2、比特1、比特0 # 新字符串 = 原比特0 + 原比特1 + 原比特3 + 原比特2 local mapped="${din[3]}${din[2]}${din[0]}${din[1]}" echo "重映射结果:$mapped" }
方法2:用fold拆分后读取
function remap { local input="$1" local -a din=() # 用fold把字符串拆成每行一个字符,再逐行读入数组 while IFS= read -r char; do din+=("$char") done < <(echo "$input" | fold -w1) # 验证与重映射逻辑同上 local mapped="${din[3]}${din[2]}${din[0]}${din[1]}" echo "重映射结果:$mapped" }
3. 优化主循环读取文件的方式
原代码用for line in cat $infile``存在隐患(比如文件名含空格、换行符时出错),建议改用while read:
infile="你的文件名" while IFS= read -r line; do data0=${line:0:4}; data1=${line:4:4}; echo "Read line: $line" echo "拆分块1: $data0" remap "$data0" echo "拆分块2: $data1" remap "$data1" echo "---" done < "$infile"
4. 测试示例
输入行01011100:
- 拆分块1
0101,重映射后为1001 - 拆分块2
1100,重映射后为0011
运行后输出类似:
Read line: 01011100 拆分块1: 0101 数组长度:4 索引1的元素:1 所有元素:0 1 0 1 重映射结果:1001 拆分块2: 1100 数组长度:4 索引1的元素:1 所有元素:1 1 0 0 重映射结果:0011 ---
内容的提问来源于stack exchange,提问作者renvill
相关产品推荐
相关产品推荐

