3

我正在尝试使用 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

这是我到目前为止所做的,但谁能帮我弄清楚如何在计算器上循环?

4

6 回答 6

5

鲜为人知的 shell 内置命令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
于 2013-01-16T04:21:24.140 回答
2

在循环中包装代码

如果您只想将代码包装在Bash 循环结构中,并且愿意按 CTRL-C 来终止循环而不是做一些更花哨的事情,那么您可以将代码包装在 while 循环中。例如:

while true; do
    : # Your code goes here, inside the loop.
done

只要确保将您的无条件exit语句移出循环体即可。否则,循环将在到达该行时终止。

于 2013-01-16T02:54:58.693 回答
1

对于您的~/.bashrc

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

只需使用bc, 使用该别名,它就会自动使用两位小数而不是整数。

于 2014-06-30T11:29:43.650 回答
0

!/bin/bash

PS3="操作是什么?" 声明-A op=([add]='+' [subtract]='-' [multiply]='*' [divide]='/')

虽然是真的;do read -p "第一个数字是多少?" n1 read -p "第二个数字是多少?" n2 select ans in "${!op[@]}"; 输入 "${!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")" 完成

于 2013-01-17T14:28:14.223 回答
0

请使用以下脚本。

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
于 2017-03-27T05:07:08.220 回答
0
#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
于 2017-11-13T10:18:22.770 回答