#linux #bash #shell #nested #sh
Вопрос:
Я готовлю код оболочки для сравнения 3 чисел. Мой код выглядит следующим образом
#!/bin/bash
echo "enter any 3 numbers"
read num1
read num2
read num3
if [ $num1 -gt $num2 ]
then
if [ $num1 -gt $num3 ]
then
echo "$num3 is greater than $num1 amp; $num1"
fi
elif [ $num2 -gt $num1 ]
then
if [ $num2 -gt $num3 ]
then
echo "$num2 is greater than $num1 amp; $num3"
fi
elif [ $num3 -gt $num1 ]
then
if [ $num3 -gt $num2 ]
then
echo "$num3 is greater then $num2 amp;$num1"
fi
else
echo "invalid"
fi
если я ставлю 1-е или 2-е по старшинству число,то это дает правильный результат, но в случае, если я ставлю 3-е по старшинству число, оно не оценивается.Второе утверждение elif не оценивается.
Ответ №1:
Давайте сначала сделаем это более читабельным:
if [ $num1 -gt $num2 ]; then
if [ $num1 -gt $num3 ]; then
echo "$num1 is greater than $num2 amp; $num3" # typos fixed
fi
elif [ $num2 -gt $num1 ]; then
if [ $num2 -gt $num3 ]; then
echo "$num2 is greater than $num1 amp; $num3"
fi
elif [ $num3 -gt $num1 ]; then
if [ $num3 -gt $num2 ]; then
echo "$num3 is greater then $num1 amp; $num2" # typos fixed
fi
else
echo "invalid"
fi
Если вы введете, например num1 == 1
, num2 == 2
, num3 == 3
,, то это не сработает, потому что это правда:
elif [ $num2 -gt $num1 ]; then
но после этого это ложь:
if [ $num2 -gt $num3 ]; then
таким образом, выхода нет. Выполнение не будет продолжаться, elif [ $num3 -gt $num1 ]; then
если это то, что вы ожидали, если так не работает.
Вы могли бы перестроить его следующим образом:
if [ $num1 -gt $num2 ] amp;amp; [ $num1 -gt $num3 ]; then
echo "$num1 is greater than $num2 amp; $num3"
elif ...
и продолжайте добавлять elif
s до тех пор, пока не будут охвачены все возможные перестановки и случаи.
Ответ №2:
Это намного проще, если вы просто сделаете два сравнения сразу:
if [ "$num1" -gt "$num2" ] amp;amp; [ "$num1" -gt "$num3" ]; then
echo "$num1 is greater than $num2 and $num3"
elif [ "$num2" -gt "$num1" ] amp;amp; [ "$num2" -gt "$num3" ]; then
echo "$num2 is greater than $num1 and $num3"
elif [ "$num3" -gt "$num1" ] amp;amp; [ "$num3" -gt "$num2" ]; then
echo "$num3 is greater than $num1 and $num2"
# else echo "no one number is biggest"
fi