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

Morse码文件编解码脚本无输出故障排查及错误咨询

排查Morse码转换器脚本无输出的问题

老哥,我瞅了你的脚本代码,执行后无输出的原因主要集中在这几个关键环节,咱们一个个说:

核心问题点

  • 命令行参数未处理,函数未被调用:你的脚本开头只打印了欢迎语,但完全没处理用户输入的-e/-d参数,也没触发对应的编码/解码函数。脚本执行完欢迎语就直接退出了,自然看不到转换结果。
  • 缺少文件读取与结果输出逻辑:就算调用了encode函数,你也没有读取目标.txt文件的内容,更没有把转换后的内容输出到终端或者文件里。
  • 解码功能缺失:你只定义了编码用的encode函数,但解码需要反向映射Morse码到字母的decode函数,目前代码里完全没这部分。

修正后的示例脚本

#!/bin/bash

echo "Hello,welcome to the Morse Code Converter!!"

# 定义编码映射表(包含字母、数字和常用标点)
declare -A morse_encode=(
    [A]=".-" [B]="-..." [C]="-.-." [D]="-.." [E]="." [F]="..-."
    [G]="--." [H]="...." [I]=".." [J]=".---" [K]="-.-" [L]=".-.."
    [M]="--" [N]="-." [O]="---" [P]=".--." [Q]="--.-" [R]=".-."
    [S]="..." [T]="-" [U]="..-" [V]="...-" [W]=".--" [X]="-..-"
    [Y]="-.--" [Z]="--.." [0]="-----" [1]=".----" [2]="..---"
    [3]="...--" [4]="....-" [5]="....." [6]="-...." [7]="--..."
    [8]="---.." [9]="----." ["."]=".-.-.-" [",]="--..--"
)

# 自动生成解码映射表(反向编码表,避免手动重复编写)
declare -A morse_decode
for key in "${!morse_encode[@]}"; do
    morse_decode[${morse_encode[$key]}]=$key
done

# 编码函数:读取文本文件,转换为Morse码
encode() {
    local input_file="$1"
    # 先检查文件是否存在
    if [ ! -f "$input_file" ]; then
        echo "Error: 文件 $input_file 不存在!"
        exit 1
    fi
    # 逐行读取文件内容,转大写后逐字符转换
    while IFS= read -r line; do
        local upper_line=$(echo "$line" | tr '[:lower:]' '[:upper:]')
        for ((i=0; i<${#upper_line}; i++)); do
            char="${upper_line:$i:1}"
            if [[ -n "${morse_encode[$char]}" ]]; then
                echo -n "${morse_encode[$char]} "
            else
                # 非映射字符(比如空格、换行)直接保留
                echo -n "$char"
            fi
        done
        echo # 每行转换完后换行
    done < "$input_file"
}

# 解码函数:读取Morse码文件,转换为文本
decode() {
    local input_file="$1"
    if [ ! -f "$input_file" ]; then
        echo "Error: 文件 $input_file 不存在!"
        exit 1
    fi
    # 逐行读取文件内容,按空格分割Morse码
    while IFS= read -r line; do
        # 先把连续空格替换为单个空格,避免空元素干扰
        line=$(echo "$line" | sed 's/  */ /g')
        for code in $line; do
            if [[ -n "${morse_decode[$code]}" ]]; then
                echo -n "${morse_decode[$code]}"
            else
                # 非Morse码字符直接保留
                echo -n "$code"
            fi
        done
        echo # 每行转换完后换行
    done < "$input_file"
}

# 处理命令行参数,判断用户是要编码还是解码
if [[ $# -ne 2 ]]; then
    echo "使用方法:"
    echo "编码: ./morse.sh -e Text.txt"
    echo "解码: ./morse.sh -d Morse_text.txt"
    exit 1
fi

case "$1" in
    -e)
        encode "$2"
        ;;
    -d)
        decode "$2"
        ;;
    *)
        echo "无效参数!"
        echo "使用方法:"
        echo "编码: ./morse.sh -e Text.txt"
        echo "解码: ./morse.sh -d Morse_text.txt"
        exit 1
        ;;
esac

修正说明

  1. 添加了参数处理逻辑:通过case语句判断-e/-d选项,自动调用对应的编码/解码函数,终于能响应你的命令行输入了。
  2. 补充了解码映射表:通过遍历编码表自动生成反向的解码映射,不用手动重复编写,省事儿还不容易错。
  3. 完善了文件读取与输出:每个函数都先检查文件是否存在,然后逐行读取内容,转换后直接输出到终端,你能实时看到结果。
  4. 兼容了更多场景:编码时自动把小写转大写,非字母数字的字符(比如空格)会保留;解码时处理了连续空格的情况,避免解析出错。

现在你可以测试这个脚本,执行./morse.sh -e Text.txt就能看到编码后的Morse码,./morse.sh -d Morse_text.txt就能得到解码后的文本啦。

内容的提问来源于stack exchange,提问作者Zach DS UniPi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:11:19