如何在while循环中构建字符串

时间:2019-07-18 14:00:48

标签: bash

我偶然发现了这个SO post,其中包含一个编码和解码摩尔斯电码的脚本。

它不是开箱即用的,但是我能够对其进行设置,以便编码可以使用,现在它对美国和大陆代码都适用。

然而,解码已被证明是一个更大的挑战。最初,它是打印出一堆Es和Is,因为不管有多少个点或连续多少行,它当然都会逐个字符地打印,而Es和Is都是这样。

因此,我知道我必须检查间距并一次只做一个字,而不是一个字一个字地

由于美国摩尔斯语中的某些字母(例如C(..。))在字母内带有空格的事实也使情况变得复杂。因此,字母之间不能有一个空格的分隔。实际上,有些字母内有2个空格,因此也不起作用。我最终在每个字母之间留出3个空格,在每个单词之间留出5个空格,这样我就可以对大陆使用相同的代码(如果我自己做大陆,那么我可以做1和3,而不是3和5)

function decode {
    declare -A letter
    if [ "$2" == "American" ]
    then
        letter[. .]="O";
        letter[.  ..]="R";
        letter[...]="S";
    fi
    for (( i = 0; i < ${#1}; i=i + 1 ));
    do
        j=1
        n=$i
        s=0
        while (( $s == 0 && $n + 3 <= ${#1} ));
        do
            ((n++))
            if [ "${1:n:3}" == "   " ]
            then
                s=1
            fi
            ((j++))
            echo "$n"
        done
        echo "j is $j i is $i"
        printf '%s' "${letter[${1:i:j}]}"
        printf '%s' " "
        sleep 0.1
    done
}
decode "...   . .   ..."

为简洁起见,删除了大多数字符。 应该的最后一行返回SOS(即American Morse中的SOS)。

如何修改for循环和嵌套的while循环,以便它确定要在我的printf语句中使用的一个字母中的所有字符,然后一直移到下一个字母记住字符串的大小吗?

到目前为止的输出如下:

American Morse: ...   . .   ...

1
2
3
j is 4 i is 0
 2
3
j is 3 i is 1
 3
j is 2 i is 2
 4
5
6
7
8
9
j is 7 i is 3
 5
6
7
8
9
j is 6 i is 4
 6
7
8
9
j is 5 i is 5
 7
8
9
j is 4 i is 6
 8
9
j is 3 i is 7
 9
j is 2 i is 8
 10
11
12
13
j is 5 i is 9
 11
12
13
j is 4 i is 10
 12
13
j is 3 i is 11
 13
j is 2 i is 12
I j is 1 i is 13
E j is 1 i is 14
E
Press ENTER to return:

0 个答案:

没有答案