You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  • 拆分块10101,重映射后为1001
  • 拆分块21100,重映射后为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:18:24