Aninhado se declaração, não funcionando corretamente

0
#! /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

Este é o meu código, mas somente no caso de o valor de entrada ser 10, ele é impresso, 11 não aparece caso eu insira 11 e também com outros valores também. Você sabe o motivo aqui?

----------- editado

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

Aqui (10 | 99) também não aparece o valor, exceto 10 ..

    
por GideokSeong 23.05.2018 / 01:02

1 resposta

1

Isso sempre será verdadeiro para números, já que a condição é ou :

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

Esse primeiro scriptlet reconhece Ten e Eleven e imprime Thirteen para todos os outros valores.

Isso sempre será falso, pois a condição é e :

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

Não sei por que você está criando o restante com case e if s. Se você quiser apenas mapear os números para palavras, um de cada vez, um único caso seria:

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

Isso não reconhecerá números com zeros iniciais (mas todas as operações aritméticas os tomarão como números de base-8, a menos que você tenha o cuidado de forçar a base manualmente a cada vez).

Se você quiser ir além de vinte, a correspondência de uma vez não será muito boa e não poderá corresponder a intervalos de números arbitrários com case . Em case , 10|99 corresponderá exatamente a essas duas cadeias (não 12 ou 123 ) e [0-9] corresponderá a dígitos únicos, por exemplo, [0-100] é o mesmo que [01] . Então, um if pode ser melhor:

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

Você deve usar [[ .. -a .. ]] ou [ .. ] && [ .. ] aqui, como [ .. -a .. ] como problemas com alguns valores (como "!" ). Se você fizer usar [ .. ] , cite as variáveis, ou seja, [ "$number" -lt 123 ] em vez de [ $number -lt 123 ] .

Isso deve funcionar, mas apenas porque você pode corresponder a uma posição específica de um dígito:

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

Se você realmente quiser dar nomes a todos os números de zero a mil, você precisará dividir o problema em partes (uns, dezenas, como combiná-los) e, de preferência, usar funções para isso.

    
por 23.05.2018 / 04:53