ネストされたifステートメントが正しく機能しません。

ネストされたifステートメントが正しく機能しません。
#! /bin/bash

number=$1
if [ $number -gt 9 -o $number -lt 100 ]
        then
            if [ $number -eq 10 ]
            then
                echo Ten
            exit
            elif [ $number -eq 11 ]
            then
                echo Eleven
            else
                echo Thirteen
            fi
fi

これは私のコードですが、入力値が10の場合にのみ印刷され、他の値と一緒に11を入力すると11は表示されません.その理由をご存知ですか?

----------修正済み

number=$1
output=""

if [ $number -lt  0 -a $number -gt 999 ]
then
    echo put the right input between 0 and 999
fi

case "$number"
in
    [0-9])
        if [ $number -eq 0 ]
        then
            echo Zero
        elif [ $number -eq 1 ]
        then
            echo One
        elif [ $number -eq 2 ]
        then
            echo Two
        elif [ $number -eq 3 ]
        then
            echo Three
        elif [ $number -eq 4 ]
        then
            echo Four
        elif [ $number -eq 5 ]
        then
            echo Five
        elif [ $number -eq 6 ]
        then
            echo Six
        elif [ $number -eq 7 ]
        then
            echo Seven
        elif [ $number -eq 8 ]
        then
            echo Eight
        elif [ $number -eq 9 ]
        then
            echo Nine

        fi
    ;;
    10|99)
        if [ $number -gt 9 -a $number -lt 100 ]
        then
            if [ $number -eq 10 ]
            then
                echo Ten
            elif [ $number -eq 11 ]
            then
                echo Eleven
            else
                echo Thirteen
            fi
        fi
    ;;
    100|999)
    if [ $number -gt 99 -a $number -lt 1000 ]
        then
            echo Two
        fi
    ;;

esac

ここで (10|99) やはり10以外の値は表示しません。

答え1

条件は次のとおりであるため、数値については常に真です。または:

if [ $number -gt 9 -o $number -lt 100 ]

最初のスクリプトは他のすべての値を認識しTenEleven印刷します。Thirteen


条件は次のようなので、これは常に偽です。そして:

if [ $number -lt  0 -a $number -gt 999 ]

caseなぜ残りの部分をaとsで構成したのかわかりませんif。数字を単語に一度に1つずつマッピングするには、単一のケースを使用できます。

case "$number" in
     0) echo Zero ;;
     1) echo One ;;
# ...
     9) echo Nine ;;
    10) echo Ten ;;
    11) echo Eleven ;;
esac

これは前にゼロの数字を認識しません(ただし、毎回手動で下を強制的に適用しない限り、すべての算術演算は8進数として扱います)。


20個以上が必要な場合は、一度に1つずつ一致させることはあまり良くなく、任意の範囲の数字と一致することはできませんcase。では、両方の文字列は正確に一致し(not、or)、単一の数字と一致するため、たとえば、次のようになりますcase。したがって、より良いかもしれません。10|9912123[0-9][0-100][01]if

if   [[ $number -ge 20 -a $number -lt 30 ]]; then
    echo Twenty-something
elif [[ $number -ge 20 -a $number -lt 30 ]]; then
    echo Thirty-something
fi

任意の値(例:)の問題としてここでまたはを[[ .. -a .. ]]使用する必要があります。もしあなたなら[ .. ] && [ .. ][ .. -a .. ]"!"する代わりに[ .. ]参照変数を使用してください。[ "$number" -lt 123 ][ $number -lt 123 ]

ただし、この方法は機能しますが、特定の数値位置を一致させることができる場合にのみ可能です。

case $number in
    2?) echo Twenty-something ;;
    3?) echo Thirty-something ;;
esac

0から1000までのすべての数字の名前を指定するには、問題を複数の部分(1、10、結合方法)に分割し、可能であれば関数を使用して実行する必要があります。

関連情報