Сценарий оболочки — переменная оболочки, не несущая прямого значения

#shell #unix #scripting

#оболочка #unix #сценарии

Вопрос:

 #!/bin/bash

while true
do
 if [[ $# -eq 0 ]] ; then

    result=$((operand1 operand2))
    result=$((operand1-operand2))
    result=$((operand1*operand2))

     if [[ $result ]] ; then 
        operand1=$result 
        echo "operand 1 is: $result" 
        echo "" 
     else 
        echo Enter operand1 value: 
        read operand1 

     fi

     # Offer choices
     echo 1. Addition
     echo 2. Subtraction
     echo 3. Multiplication
     echo 4. Division
     echo 5. Exit


     echo Enter your choice:
     read choice


     if [[ $choice != 1 amp;amp; $choice != 2 amp;amp; $choice != 3 amp;amp; $choice != 4 amp;amp; $choice != 5 ]] ; then
         echo Sorry not a valid operator - please try again 
         echo Enter your choice:
         read choice

     fi

     echo Enter operand2 value:
     read operand2

     # get operands and start computing based on the user's choice
     if [[ $choice -eq 1 ]] ; then

         echo ----------------------------------------
         echo Addition of $operand1 and $operand2 is $((operand1 operand2))
         echo ----------------------------------------
         echo

     elif [[ $choice -eq 2 ]] ; then

         echo ----------------------------------------
         echo Subtraction of $operand1 and $operand2 is $((operand1-operand2))
         echo ----------------------------------------
         echo
     elif [[ $choice -eq 3 ]] ; then

         echo ----------------------------------------
         echo Multiplication of $operand1 and $operand2 is $((operand1*operand2))
         echo ----------------------------------------
         echo
     elif [[ $choice -eq 4 amp;amp; operand2 -eq 0 ]] ; then
         echo Can not divide by 0 please try again 
         echo Please enter operand2
         read operand2
         echo ----------------------------------------
         echo Division of $operand1 and $operand2 is $((operand1/operand2))
         echo ----------------------------------------
         echo

      elif [[ $choice -eq 4 amp;amp; operand2 -ne 0 ]] ; then
         echo ----------------------------------------
         echo Division of $operand1 and $operand2 is $((operand1/operand2))
         echo ----------------------------------------
         echo

     elif [[ $choice -eq 5 ]] ; then
         exit

     else
         echo ----------------------------------------
         echo Invalid choice.. Please try again
         echo ----------------------------------------
         echo
     fi

   else
         echo ----------------------------------------
         echo You either passed too many parameters or too less
         echo than the optimum requirement.
         echo
         echo This program accepts a maximum of 2 arguments or no
         echo argument at all in order to run successfully.
         echo ----------------------------------------
   fi
done
 

Я работаю конкретно над верхней частью этого кода. Я пытаюсь сделать так, чтобы результат пользователя был перенесен на следующий операнд 1. Я получаю операнд 1 = 0 после каждого вычисления. Есть идеи, как это исправить?
операнд 1 равен: 0

 1. Addition
2. Subtraction
3. Multiplication
4. Division
5. Exit
Enter your choice:
1
Enter operand2 value:
1
----------------------------------------
Addition of 0 and 1 is 1
----------------------------------------

operand 1 is: 0

1. Addition
2. Subtraction
3. Multiplication
4. Division
5. Exit
Enter your choice:

 

Комментарии:

1. Вы пробовали запускать код с помощью bash -x?

2. Можете ли вы отредактировать свой вопрос, чтобы показать пример запуска, который показывает ошибку?

3. @MarkPlotnick, как ни странно, это работает, когда я очищаю и повторно ввожу код в свою оболочку, затем он вычисляет все предыдущие значения до того, как я очистил, и добавляет их, хотя, когда я запускаю, это то, что делает мой операнд 1. Добавлено к вопросу

4. Какова цель 3 присваивания result в начале тела цикла? Нет присваивания result , которое зависит от выбранной операции.

5. Можете ли вы объяснить, что if [[ $result ]] это значит? Я думаю, что может быть лучший способ.

Ответ №1:

Вот способ уменьшить дублированный код. Обратите внимание на использование select для представления меню.

 #!/bin/bash

PS3="Enter the operation: "     # for the select statement

operand() {
    read -r -p "Enter operand${1} value: "
    echo "$REPLY"
}

operand1=$(operand 1)

while true; do
    select operation in Addition Subtraction Multiplication Division Exit; do
        case $operation in
            Exit) exit ;;
            Addition)       op=" "; break ;;
            Subtraction)    op="-"; break ;;
            Multiplication) op="*"; break ;;
            Division)       op="/"; break ;;
        esac
    done

    while true; do
        operand2=$(operand 2)
        if [[ $operation == "Division" ]] amp;amp; (( operand2 == 0 )); then
            echo Can not divide by 0 please try again 
        else
            break
        fi
    done

    (( result = operand1 $op operand2 ))

    echo "----------------------------------------"
    echo "$operation of $operand1 and $operand2 is $result"
    echo "----------------------------------------"

    echo "operand 1 is: $result" 
    operand1=$result
done
 

Ответ №2:

 #!/bin/bash

while true
do

         if [[ $result ]] ; then 

            echo "operand 1 is: $result" 
            echo "" 

         else 
            echo Enter operand1 value: 
            read operand1 

         fi

         # Offer choices
         echo 1. Addition
         echo 2. Subtraction
         echo 3. Multiplication
         echo 4. Division
         echo 5. Exit

 
         echo Enter your choice:
         read choice


         if [[ $choice != 1 amp;amp; $choice != 2 amp;amp; $choice != 3 amp;amp; $choice != 4 amp;amp; $choice != 5 ]] ; then
             echo Sorry not a valid operator - please try again 
             echo Enter your choice:
             read choice

         fi
 
         echo Enter operand2 value:
         read operand2
 
         # get operands and start computing based on the user's choice
         if [[ $choice -eq 1 ]] ; then
 
             echo ----------------------------------------
             echo Addition of $operand1 and $operand2 is $((operand1 operand2))
             result=$((operand1 operand2))
             echo ----------------------------------------
             echo

         elif [[ $choice -eq 2 ]] ; then
 
             echo ----------------------------------------
             echo Subtraction of $operand1 and $operand2 is $((operand1-operand2))
             result=$((operand1-operand2))
             echo ----------------------------------------
             echo
         elif [[ $choice -eq 3 ]] ; then
 
             echo ----------------------------------------
             echo Multiplication of $operand1 and $operand2 is $((operand1*operand2))
             result=$((operand1*operand2))
             echo ----------------------------------------
             echo
         elif [[ $choice -eq 4 amp;amp; operand2 -eq 0 ]] ; then
             echo Can not divide by 0 please try again 
             echo Please enter operand2
             read operand2
             echo ----------------------------------------
             echo Division of $operand1 and $operand2 is $((operand1/operand2))
             echo ----------------------------------------
             echo

          elif [[ $choice -eq 4 amp;amp; operand2 -ne 0 ]] ; then
             echo ----------------------------------------
             echo Division of $operand1 and $operand2 is $((operand1/operand2))
             result=$((operand1/operand2))
             echo ----------------------------------------
             echo

         elif [[ $choice -eq 5 ]] ; then
             exit

         else
             echo ----------------------------------------
             echo Invalid choice.. Please try again
             echo ----------------------------------------
             echo
         fi
done
 

Комментарии:

1. Вы говорите , что «операнд 1 равен: $result», но вы не присваиваете operand1 значение результата.