我一直在编写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;
答案 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
中。
仔细看看,如果我解决了您的问题,请告诉我。如果没有,请发表评论,我会进一步提供帮助。