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
修正说明
- 添加了参数处理逻辑:通过
case语句判断-e/-d选项,自动调用对应的编码/解码函数,终于能响应你的命令行输入了。 - 补充了解码映射表:通过遍历编码表自动生成反向的解码映射,不用手动重复编写,省事儿还不容易错。
- 完善了文件读取与输出:每个函数都先检查文件是否存在,然后逐行读取内容,转换后直接输出到终端,你能实时看到结果。
- 兼容了更多场景:编码时自动把小写转大写,非字母数字的字符(比如空格)会保留;解码时处理了连续空格的情况,避免解析出错。
现在你可以测试这个脚本,执行./morse.sh -e Text.txt就能看到编码后的Morse码,./morse.sh -d Morse_text.txt就能得到解码后的文本啦。
内容的提问来源于stack exchange,提问作者Zach DS UniPi
相关产品推荐
相关产品推荐

