如何从输入中找到字母表中的第一个字母并计算输入字母

时间:2017-08-31 08:20:07

标签: linux bash unix

我一直在编写bash脚本,使用read命令接受一系列大写字母的输入,一次一个。输入以0结尾。在所有有效输入字母和有效输入字母总数的计数中,按字母顺序查找并显示第一个字母。

如果我,例如,D,G,T,W,Q,3,B,1,D,S,0的输入,预期输出是:

“3是无效输入”

“1是无效输入” “所有输入字母表中的第一个字母是B”

“您输入了8封有效字母。”

以下是我的一些代码,请让我知道我需要解决的问题

#!/bin/bash
IV=()
loop=-1
c=Z
ac=0

while [ $loop -gt 0] || [ $loop -t 0]
do
echo "Enter an uppercase Alphabet"
read b
if [[ $b = [A-Z] ]]
then
      ac=`expr $ac +1`
      if [ $b \< $c ]
      then
              c=$b
      fi

elif [ $b = "0" ]
then
       loop=`expr $loop +1`
       for i in "${IV[@]}"
       do
       echo $i "is an invalid input"
       done
       echo "The first letter in Alphabetical order of all input is" $c
       echo "You have entered" $ac "valid letters."

else
       IV[@]=$b
fi
done

所以,我的问题是,如果我输入无效的字符串或int,输出就像 &#34; IV [@]:错误的数组下标&#34;

1 个答案:

答案 0 :(得分:0)

看起来您的代码已接近完成您希望它执行的操作。通过一些调整和方便参数扩展将所有输入变为大写,您可以执行以下操作:

#!/bin/bash

declare -a IV   # invalid values
c=Z
ac=0

while :
do
    echo "Enter an uppercase Alphabet"
    read b
    b="${b^^}"
    if [[ $b = [A-Z] ]]
    then
        ((ac++))
        [ "$b" \< "$c" ] && c="$b"
    elif [ "$b" -eq "0" ]
    then
        for i in "${IV[@]}"
        do
            echo $i "is an invalid input"
            done
            echo "The first letter in Alphabetical order of all input is" $c
            echo "You have entered" $ac "valid letters."
        break;
    else
        IV+=("$b")
    fi
done

注意:我完全删除了loop值,并将其替换为简单的break,这看起来更像是条件码的更清晰的实现。

示例使用/输出

$ bash letterseries.sh
Enter an uppercase Alphabet
d
Enter an uppercase Alphabet
g
Enter an uppercase Alphabet
t
Enter an uppercase Alphabet
w
Enter an uppercase Alphabet
q
Enter an uppercase Alphabet
3
Enter an uppercase Alphabet
b
Enter an uppercase Alphabet
1
Enter an uppercase Alphabet
d
Enter an uppercase Alphabet
s
Enter an uppercase Alphabet
0
3 is an invalid input
1 is an invalid input
The first letter in Alphabetical order of all input is B
You have entered 8 valid letters.

这提供了您的预期输出和主要更改(除了风格上将(( .. ))b="${b^^}"更改为大写,代码主要是您所拥有的。主要问题是您的< / p>

 IV[@]=$b

哪种语法无效。看来你打算:

    IV+=("$b")

"$b"的每个值存储在索引数组IV中。

仔细看看,如果我解决了您的问题,请告诉我。如果没有,请发表评论,我会进一步提供帮助。