Создание скрипта калькулятора
Я пытаюсь сделать калькулятор с помощью скрипта bash. Пользователь вводит число, выбирает, хотят ли они складывать, вычитать, умножать или делить. Затем пользователь вводит второе число и может выбрать, следует ли делать сумму, или складывать, вычитать, умножать или делить снова в цикле.
Я не могу сейчас сориентироваться
echo Please enter a number
read number
echo What operation would you like to perform: 1: Add, 2: Subtract, 3: Multiple, 4: Divide
read operation
case $operation in
1) math='+';;
2) math='-';;
3) math='*';;
4) math='/';;
*) math='not an option, please select again';;
esac
echo "$number $math"
echo Please enter a number
read number2
echo What operation would you like to perform: 1: Add, 2: Subtract, 3: Multiple, 4: Divide, 5: Equals
read operation2
case $operation2 in
1)math2='Add';;
2)math2='Subtract';;
3)math2='Multiply';;
4)math2='Divide';;
5)math2='Equals';;
*)math2='not an option, please select again';;
esac
echo You have selected $math2
exit 0
Это то, что я сделал до сих пор, но может ли кто-нибудь помочь мне разобраться, как вернуться на калькулятор?
7 ответов
Менее известная встроенная команда оболочки select
удобен для такого рода программ на основе меню:
#!/bin/bash
while true; do
read -p "what's the first number? " n1
read -p "what's the second number? " n2
PS3="what's the operation? "
select ans in add subtract multiply divide; do
case $ans in
add) op='+' ; break ;;
subtract) op='-' ; break ;;
multiply) op='*' ; break ;;
divide) op='/' ; break ;;
*) echo "invalid response" ;;
esac
done
ans=$(echo "$n1 $op $n2" | bc -l)
printf "%s %s %s = %s\n\n" "$n1" "$op" "$n2" "$ans"
done
Образец вывода
what's the first number? 5
what's the second number? 4
1) add
2) subtract
3) multiply
4) divide
what's the operation? /
invalid response
what's the operation? 4
5 / 4 = 1.25000000000000000000
Если бы я собирался увлечься функциями bash v4 и DRY:
#!/bin/bash
PS3="what's the operation? "
declare -A op=([add]='+' [subtract]='-' [multiply]='*' [divide]='/')
while true; do
read -p "what's the first number? " n1
read -p "what's the second number? " n2
select ans in "${!op[@]}"; do
for key in "${!op[@]}"; do
[[ $REPLY == $key ]] && ans=$REPLY
[[ $ans == $key ]] && break 2
done
echo "invalid response"
done
formula="$n1 ${op[$ans]} $n2"
printf "%s = %s\n\n" "$formula" "$(bc -l <<< "$formula")"
done
Как насчет этого
calc ()
{
(( d = $1 ))
echo $d
}
выход
$ calc '6 + 2'
8
$ calc '6 - 2'
4
$ calc '6 * 2'
12
$ calc '6 / 2'
3
Код упаковки в цикле
Если вы просто хотите обернуть свой код в конструкцию цикла Bash и хотите нажать CTRL-C, чтобы завершить цикл, а не делать что-то более причудливое, то вы можете обернуть свой код в цикл while. Например:
while true; do
: # Your code goes here, inside the loop.
done
Просто убедитесь, что ваш безусловный ход exit
Выписка из тела цикла. В противном случае цикл завершается всякий раз, когда достигает этой строки.
Это вычисляет использует до 4 десятичных знаков (при необходимости), работает без кавычек.
calc ()
{
echo "scale=4;$*" | bc -l
}
Единственный недостаток, вы должны бежать *
иначе оболочка будет использовать его для расширения файла.
Использование:
calc 1 + 2
calc 3 - 4
calc 44 \* 88
calc 77 / 234
Это следует делать в большинстве случаев, когда вам нужен быстрый калькулятор.
Пожалуйста, используйте следующий скрипт.
clear
sum=0
i="y"
echo " Enter one no."
read n1
echo "Enter second no."
read n2
while [ $i = "y" ]
do
echo "1.Addition"
echo "2.Subtraction"
echo "3.Multiplication"
echo "4.Division"
echo "Enter your choice"
read ch
case $ch in
1)sum=`expr $n1 + $n2`
echo "Sum ="$sum;;
2)sum=`expr $n1 - $n2`
echo "Sub = "$sum;;
3)sum=`expr $n1 \* $n2`
echo "Mul = "$sum;;
4)sum=`expr $n1 / $n2`
echo "Div = "$sum;;
*)echo "Invalid choice";;
esac
echo "Do u want to continue ?"
read i
if [ $i != "y" ]
then
exit
fi
done
!/ Bin/ Баш
PS3="что за операция? " Объявить -A op=([добавить]='+' [вычесть] = '-' [умножить]='*' [делить]='/')
пока правда; читать -p "что такое первое число? " n1 читать -p "что такое второе число? " n2 выбирать ans в "${!op[@]}"; сделать для ключа в "${!op[@]}"; do [[ $REPLY == $key ]] && ans=$REPLY [[ $ans == $key ]] && break 2 done echo "Неверный ответ" сделано формула ="$n1 ${op[$ans]} $n2" printf "%s = %s\n\n" "$ формула " "$(bc -l <<< "$ формула")"сделано
#calculator
while (true) # while loop 1
do
echo "enter first no"
read fno
if [ $fno -eq $fno 2>/dev/null ]; # if cond 1 -> checking integer or not
then
c=1
else
echo "please enter an integer"
c=0
fi # end of if 1
if [ $c -eq 1 ]; #if 2
then
break
fi # end of if 2
done # end of whie 1
while(true) #while loop 2
do
echo "enter second no"
read sno
if [ $sno -eq $sno >/dev/null 2>&1 ] # if cond 3 -> checking integer or not
then
c=1
else
echo "please enter an integer"
c=0
fi # end of if 3
if [ $c -eq 1 ] # if cond 4
then
break
fi # end of if 4
done #2
while(true) # while loop 3
do
printf "enter the operation (add,div,mul,sub) of $fno and $sno\n"
read op
count=0
##addition
if [ $op = add ] #if cond 5
then
echo "$fno+$sno is `expr $fno + $sno`"
#multiplication
elif [ $op = mul ];
then
echo "$fno*$sno is `expr $fno \* $sno`"
#substraction
elif [ $op = sub ]
then
while(true) #while loop 3.1
do
printf "what do you want to do??? \n 1. $fno-$sno \n 2. $sno-$fno"
printf "\n press the option you want to perform?(1 or 2)\n"
read opt
if [ $opt = 1 ] #if cond 5.1
then
echo "$fno-$sno is `expr $fno - $sno`"
break
elif [ $opt = 2 ]
then
echo " $sno-$fno is `expr $sno - $fno`"
break
else "please enter valid options to proceed(1 or 2)";
clear
fi #end of if 5.1
done # end of 3.1
#division
elif [ $op = div ]
then
while(true) # whilw loop 3.2
do
printf "what do you want to do??? \n 1. $fno/$sno \n 2. $sno/$fno"
printf "\n press the option you want to perform?(1 or 2)\n"
read opt
if [ $opt = 1 ] #if cond 5.2
then
echo "$fno divided by $sno is `expr $fno / $sno`"
break
elif [ $opt = 2 ]
then
echo " $sno divided by $fno is `expr $sno / $fno`"
break
else
clear
fi #end of if 5.2
done # end of 3.2
else
echo "valid option please!!!"
count=1
fi # end of if 5
if [ $count -eq 0 ] #if cond 6
then
echo "Do you want to do more ops"
echo "(y/n)"
read ans
clear
if [ $ans = n ] # if 6.1
then
break
fi # end of if 6.1
fi #end of if 6
done #end of while 3