#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 значение результата.