2016-12-02 3 views
0

終了スクリプトを展開するために終了エラーを作成しようとしています。私は今、数以外のものを入力し、私がこれまでにしようとしていることである場合:私はforループの構造体がbashの場合

add 1 2 3 four five 

に入力した場合

sum=0 
for num in "[email protected]" 
do 
echo $num | grep -i [^0-9+-] 
if ["$?" = 1] then 
echo "Sorry, '$num' is not a number" 
fi 

sum=$((sum + num)) 
done 
echo $sum 

例は

four 
Sorry, 'four' is not a number 
+0

を何あなたは達成したいですか?数字以外の文字列が渡された場合でも、数値としてカウントされます。それが正しいか?また$? = 1が間違っています。正しい構文は$ですか? -eq 1しかし$を使う方が良いですか? -gt 0より頑強です – m47730

+0

@ m47730おそらく '$? 'を使うのではなく、コマンドで直接' if'を使う方が良いでしょう。 –

+0

@TomFenech私はあなたに同意した。私は、 "-gt 0"を "-eq 1"の代わりに使用するほうが良いと言っています。 – m47730

答えて

1

の次のセクションを言うだろうあなたのコード:

echo $num | grep -i [^0-9+-] 
if ["$?" = 1] then 

Shこれに変更することがウルド:

if grep -q '[^0-9+-]' <<< "$num"; then 

をテスト([)の内部では、スペースは重要ですが、とにかく、ここでそれを使用する必要はありません。 -qを使用すると、grepが出力を生成しないことを意味します。終了ステータスは、一致が検出されたかどうかを示します。したがって、ifと直接使用できます。

コメントで述べたように、有効な整数に一致するパターンをより堅牢にすることができます。整数を検出する良い方法のいくつかは、this related questionに示されています。たとえば、あなたはこのような何かにあなたのgrepのパターンを変更することができます:

grep -qE '^[+-]?(0|[1-9][0-9]*)$' 

かは、最も人気のある答えのようにその質問に、ネイティブ正規表現を使用します。

re='^[+-]?(0|[1-9][0-9]*)$' 
if [[ $num =~ $re ]]; then 
    sum=$((sum + num)) 
else 
    echo "Sorry, '$num' is not a number" 
fi 

でも、このパターンではありませんとりわけ0の先頭から始まる数字では失敗するため、完璧です。

+0

また、入力でソール '-'についてテストする必要があります。正規表現はやや複雑になります。 –

+0

@ジャン=フランソワそれは良い点です、私は私の答えを編集しました。 –

+1

「09」は、8進数として解釈されるため、加算にエラーが発生することに注意してください。 – choroba

0

外に出す必要はありません。それは八進数として解釈され、加えて、失敗されるように

#!/bin/bash 
shopt -s extglob 

sum=0 
for num in "[email protected]" ; do 
    if [[ $num != @(0|?([-+])[1-9]*([0-9])) ]] ; then 
     echo "Sorry, '$num' is not a number" 
     exit 1 
    fi 
    ((sum += num)) 
done 
echo $sum 

09ことは、許可されていません:あなたは、番号の形式を検証するために、一致の拡張パターンを使用することができ、それがすべてでははっきりしていない

value too great for base (error token is "09") 
+0

またはもっと単純な '[[$ num =〜^ [+ - ]?[0-9]]]'。 – SLePort

+0

@SLePort:それは '09'を捕まえません。 – choroba

+0

@SLePort:正しい正規表現はもう一方の答えにあります。私はちょうど正規表現でさえ強すぎることをここで示したかった。 – choroba

関連する問題