2

下面代码的问题是我似乎无法让数组识别文本中何时有空格。我认为在数组中添加 ' ' 值可以解决这个问题,但我错了。我没有从关于如何让数组识别 bash 脚本中的空格的搜索中找到太多运气。

#!/bin/bash
if [ "$1" == "-e" ]; then # if the cli argument is -e
    OPT="encrypt"; # set the option to encrypt
elif [ "$1" == "-d" ]; then # if the cli argument is -d
    OPT="decrypt"; # set the option to decrypt
else # else show the proper usage
    echo "Usage - Encrypt text: ./l33t.sh -e text";
    echo "Usage - Decrypt text: ./l33t.sh -d text";
    exit;
fi
#creating an array for leet text and plain text
declare -a LEET=('ɐ' 'ß' '©' 'Ð' '€' 'ƒ' '&' '#' 'I' '¿' 'X' '£' 'M' '?' 'ø' 'p' 'O' 'Я' '§' '†' 'µ' '^' 'W' '×' '¥' 'z' '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' ' ');
declare -a ENG=('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' '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' ' ');
echo -n "Please enter a string to $OPT: "; # asking for user input
read INPUT; # grab the input
while read letter; # for each character in the input (check the grep near done)
do
    for i in {0..37} # for each item in the array
    do
            if [ "$OPT" == "encrypt" ]; then # if the option is set to encrypt
                    FIND=${ENG[$i]}; # the array to look through is the plain array
            elif [ "$OPT" == "decrypt" ]; then # else the array to look through is the leet text array
                    FIND=${LEET[$i]};
            fi

            if [ "$OPT" == "encrypt" ]; then # if the option is set to encrypt
                    if [ "$FIND" == "$letter" ]; then # if our character is in the plain array
                            ENCRYPTED+=${LEET[$i]}; # Add to Encrypted that values leet transformation
                    fi
            elif [ "$OPT" == "decrypt" ]; then # else do the same thing except with oposite arrays
                    if [ "$FIND" == "$letter" ]; then
                            ENCRYPTED+=${ENG[$i]};
                    fi
            fi
    done
done < <(grep -o . <<< $INPUT)
echo $ENCRYPTED; # echo the result
4

3 回答 3

3

改变

while read letter

while IFS= read -r letter

否则,读取命令会忽略前导和尾随空格。当您尝试读取空间时,这一点至关重要。

于 2013-08-07T10:03:01.570 回答
0

我不确定您进行比较的哪一部分,但我认为引用您的变量 ENCRYPTED 也会有所帮助:

echo "$ENCRYPTED"

我也没有看到代码的任何部分与空间进行比较的可能实例可能是一个问题。

添加:您只有 37 个元素,因此循环也应该只有 0 到 36:

for i in {0..36} # for each item in the array

可能这会让你附加一个空字符。

于 2013-08-07T09:44:18.397 回答
0

考虑使用 tr (man tr 了解更多细节,自然)。

于 2013-08-07T09:45:06.237 回答