2017-08-31 21 views
0

私は一連の大文字アルファベット文字の入力を受け入れるreadコマンドを使ってbashスクリプトをコーディングしています。入力は0で終わります。すべての有効な入力文字と有効な入力文字の合計数の間でアルファベット順に最初の文字を検索して表示します。アルファベットの最初の文字を入力から探し出し、入力した文字を数える方法

Iは、例えば、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型の場合、出力は のようなものです「IV [@]:悪い配列の添字」ということで、コードが何をやって近くにいるように見えます

+0

投稿されたコードで直面している問題は何ですか?何があなたのために働かないのですか?あなたはレビューをお探しですか?その後、おそらくhttps://codereview.stackexchange.com/でよりよく適合します 始めに、shebangを '#!/ bin/bash -x'に変更し、出力を見てください... –

+0

ああ、残念です。私の問題は、無効な文字列またはintを入力すると、出力が "IV [@]:不良配列の添え字"のようになります。 –

+1

これは、IV [@] = $ b'を実行できないためです。 '@ '指定子はあなたがすべての要素をリストすることを可能にしますが、割り当てのために' lvalue'として使用することはできません。なぜ 'ac =' expr $ ac + 1'ですか?シンプルな((aC++))がすべて必要です。 'expr'は動作しますが、* s l o w l y ... *。 '[$ b \ <$ c]'とは何ですか?[** ShellCheck.net **](http://www.shellcheck.net/)でコードを実行しましたか? –

答えて

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^^}"と文体以外の主な変更点は、(、コードは、あなたが持っていたもの、主です。主な問題は、無効な構文であるあなたの

IV[@]=$b 

だったあなたが意図した表示されます。

IV+=("$b") 

"$b"の各値をインデックス付き配列IVに格納します。

あなたの問題に対処するかどうかを見て、私に知らせてください。そうでない場合は、コメントを削除して、さらに手伝ってください。

関連する問題