Я получаю ошибку во вложенном операторе elif в скриптах оболочки

#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