嵌套 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。如果您只想将数字映射到单词,一次一个,则单个案例即可:

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

这不会识别带有前导零的数字(但无论如何,所有算术运算都会将它们视为以 8 为基数的数字,除非您每次都小心地手动强制使用基数)。


如果您想要高于 20 个,一次匹配一个就不太好,而且您无法使用 匹配任意数字范围case。在case,10|99中将完全匹配这两个字符串(not 12, or 123),并[0-9]匹配单个数字,因此eg[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

如果你真的想给从零到一千的所有数字命名,你需要将问题分成几个部分(个、十、如何组合它们),并且最好使用函数来实现。

相关内容