중첩된 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 ]

첫 번째 스크립트는 다른 모든 값을 인식 Ten하고 Eleven인쇄합니다 .Thirteen


조건이 다음과 같으므로 이는 항상 거짓입니다.그리고:

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

case왜 나머지 부분을 a 및 s로 구성했는지 모르겠습니다 if. 숫자를 단어에 한 번에 하나씩 매핑하려면 단일 사례를 사용하면 됩니다.

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

이것은 앞에 0이 있는 숫자를 인식하지 못합니다(그러나 매번 수동으로 밑을 강제로 적용하지 않는 한 모든 산술 연산은 이를 8진 숫자로 처리합니다).


20개 이상을 원하는 경우 한 번에 하나씩 일치시키는 것은 그리 좋지 않으며 어떤 범위의 숫자와도 일치를 사용할 수 없습니다 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, 결합 방법)으로 나누고 가급적이면 함수를 사용하여 수행해야 합니다.

관련 정보