【问题标题】:Why does my Morse code converter display no output?为什么我的摩尔斯电码转换器没有显示输出?
【发布时间】:2018-02-01 13:22:19
【问题描述】:

我想做一个莫尔斯电码转换器,将txt文件中的字母转换为莫尔斯电码,将txt文件中的莫尔斯电码转换为字母。

执行方式是./morse.sh -e Text.txt进行编码,./morse.sh -d Morse_text.txt进行解码。我唯一的问题是由于某种原因输出没有显示在屏幕上。

这里是代码。如果我犯了错误,请告诉我。

#!/bin/bash

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

encode(){
    declare -A morse
    morse[A]=".-";
    morse[B]="-...";
    morse[C]="-.-.";
    morse[D]="-..";
    morse[E]=".";
    morse[F]="..-.";
    morse[G]="--.";
    morse[H]="....";
    morse[I]="..";
    morse[J]=".---";
    morse[K]="-.-";
    morse[L]=".-..";
    morse[M]="--";
    morse[N]="-.";
    morse[O]="---";
    morse[P]=".--.";
    morse[Q]="--.-";
    morse[R]=".-.";
    morse[S]="...";
    morse[T]="-";
    morse[U]="..-";
    morse[V]="...-";
    morse[W]=".--";
    morse[X]="-..-";
    morse[Y]="-.--";
    morse[Z]="--..";
    morse[1]=".----";
    morse[2]="..---";
    morse[3]="...--";
    morse[4]="....-";
    morse[5]=".....";
    morse[6]="-....";
    morse[7]="--...";
    morse[8]="---..";
    morse[9]="----.";
    morse[0]="-----";

    for (( k = 0; k < ${#morse}; k=k + 1 )); do
        echo "${morse}"
    done
}

decode(){
    declare -A letter
    letter[.-]="A";
    letter[-...]="B";
    letter[-.-.]="C";
    letter[-..]="D";
    letter[.]="E";
    letter[..-.]="F";
    letter[--.]="G";
    letter[....]="H";
    letter[..]="I";
    letter[.---]="J";
    letter[-.-]="K";
    letter[.-..]="L";
    letter[--]="M";
    letter[-.]="N";
    letter[---]="O";
    letter[.--.]="P";
    letter[--.-]="Q";
    letter[.-.]="R";
    letter[...]="S";
    letter[-]="T";
    letter[..-]="U";
    letter[...-]="V";
    letter[.--]="W";
    letter[-..-]="X";
    letter[-.--]="Y";
    letter[--..]="Z";
    letter[-----]="0";
    letter[.----]="1";
    letter[..---]="2";
    letter[...--]="3";
    letter[....-]="4";
    letter[.....]="5";
    letter[-....]="6";
    letter[--...]="7";
    letter[---..]="8";
    letter[----.]="9";

    for (( i = 0; i < ${#morse}; i=i + 1 )); do
        echo "${letter:i}"
    done
}

if [[ $1 = "-e" ]]; then
    while IFS= read -r line || [[ -n "$line" ]] ; do
        echo "The text is : $line"
        echo "Morse code is:"
    done < "$2"
    encode "$@"
elif [[ $1 = "-d" ]]; then
    while IFS= read -r line1 || [[ -n "$line1" ]] ; do
        echo "The Morse code is : $line1"
        echo "The translation is:"
    done < "$2"
    decode "$@"
else
    echo "Please try again using -e or -d"
fi

【问题讨论】:

  • 我可以立即看到一些事情:您将morse 用作包含$3 的变量和关联数组; echo $($3) 正在尝试将 $3 的内容作为命令运行;当您调用一个函数时,该函数会获得自己的位置参数,因此 $3 不会是您在函数中所期望的;你应该引用更多的参数扩展。
  • 您的函数中的逻辑似乎是倒退的。 done 之后的所有内容都没有任何效果。
  • 我们要求问题包含minimal reproducible example -- 描述特定问题的尽可能短的代码。不要只是把你的整个程序放到一个问题中——找到它失败的具体地方,并编写尽可能短的脚本来演示同样的问题。
  • ...如果您想更好地找出失败的位置和方式,让您编写该复制器,请使用 PS4=':${LINENO}+' bash -x yourscript 运行脚本,并记录它执行的每个命令,以便您可以跟踪确切地说,它的实际行为首先开始偏离您的预期。

标签: bash shell morse-code


【解决方案1】:

这可能是一个迟到的答案,但我认为这种方法会更简单:

您将需要 3 个文件:

  • 软件
  • 词典
  • 要翻译的莫尔斯语(可以是管道或参数)

逻辑方法是将每个莫尔斯“单词”(字母)匹配到字典并输出结果。

一个简单的字典可能是这样的:

A [.-]
B [-...]
C [-.-.]
D [-..]
E [.]
...

您的输入应包含一行要翻译的文本: 例如

.... . .-.. .-.. --- ....... .-- --- .-. .-.. -..

软件可能如下所示:

#!/bin/bash
# Get the string from the file (could be a parameter)
str=$(cat test.morse)

# Iterate over every 'word' in the string (split the spaces)
for code in $str; do
        # Find the corresponding line in the dictionnary (dict.csv)
        letter=$(grep -F "[${code}]" dict.csv  | head -c1)
        # Print the letter without caret return
        echo -n $letter
        # if the letter is empty, print a space
        if [[ "$letter" == '' ]]; then
                echo -n ' '
        fi
done
# Print a carret return at the end
echo ""

【讨论】:

    【解决方案2】:

    我改编了你的代码,现在可以了:

    #!/bin/bash
    
    encode_char(){
        declare -A morse
        morse[A]=".-";
        morse[B]="-...";
        morse[C]="-.-.";
        morse[D]="-..";
        morse[E]=".";
        morse[F]="..-.";
        morse[G]="--.";
        morse[H]="....";
        morse[I]="..";
        morse[J]=".---";
        morse[K]="-.-";
        morse[L]=".-..";
        morse[M]="--";
        morse[N]="-.";
        morse[O]="---";
        morse[P]=".--.";
        morse[Q]="--.-";
        morse[R]=".-.";
        morse[S]="...";
        morse[T]="-";
        morse[U]="..-";
        morse[V]="...-";
        morse[W]=".--";
        morse[X]="-..-";
        morse[Y]="-.--";
        morse[Z]="--..";
        morse[1]=".----";
        morse[2]="..---";
        morse[3]="...--";
        morse[4]="....-";
        morse[5]=".....";
        morse[6]="-....";
        morse[7]="--...";
        morse[8]="---..";
        morse[9]="----.";
        morse[0]="-----";
        morse[ ]="/"
    
        morse[space]="/"
        morse[return]="\n"
    
        echo -ne "${morse[${1}]:-/} "  # return "/" if not in dictionary
    }
    
    decode_char(){
        declare -A letter
        letter[.-]="A";
        letter[-...]="B";
        letter[-.-.]="C";
        letter[-..]="D";
        letter[.]="E";
        letter[..-.]="F";
        letter[--.]="G";
        letter[....]="H";
        letter[..]="I";
        letter[.---]="J";
        letter[-.-]="K";
        letter[.-..]="L";
        letter[--]="M";
        letter[-.]="N";
        letter[---]="O";
        letter[.--.]="P";
        letter[--.-]="Q";
        letter[.-.]="R";
        letter[...]="S";
        letter[-]="T";
        letter[..-]="U";
        letter[...-]="V";
        letter[.--]="W";
        letter[-..-]="X";
        letter[-.--]="Y";
        letter[--..]="Z";
        letter[-----]="0";
        letter[.----]="1";
        letter[..---]="2";
        letter[...--]="3";
        letter[....-]="4";
        letter[.....]="5";
        letter[-....]="6";
        letter[--...]="7";
        letter[---..]="8";
        letter[----.]="9";
        letter[/]=" ";
    
        letter[space]=" ";
    
        echo -ne "${letter[${1}]}"
    }
    
    
    
    
    if [[ $1 = "-e" ]]; then
        while IFS= read -r line || [[ -n "$line" ]] ; do
            #echo "The text is : $line"
            #echo "Morse code is:"
            for ch in $(echo "${line^^}" | grep -o . | sed 's/ /space/g') ; do  # convert line to uppercase, then convert to character array, then replace " " with something else, since for loop won't recongnize " " as an item
                encode_char "$ch"
            done
            echo
        done < "$2"
    elif [[ $1 = "-d" ]]; then
        while IFS= read -r line1 || [[ -n "$line1" ]] ; do
            #echo "The Morse code is : $line1"
            #echo "The translation is:"
            for ch in $(echo "${line1}" | sed 's./.\nspace\n.g') ; do  # convert "/" into a separate non-empty line
                decode_char "$ch"
            done
            echo " "
        done < "$2"
    else
        echo "Please try again using -e or -d"
    fi
    

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2012-01-11
      相关资源
      最近更新 更多