我正在试图用bash脚本来做一个计算器。 用户input一个数字,select是否要加,减,乘或除。 然后用户input第二个数字,并且可以select是否进行总和,或者在循环上再次加,减,乘或除。
我现在无法理解这一点
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
这是我迄今为止所做的,但任何人都可以帮助我了解如何循环使用计算器?
鲜为人知的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
这个怎么样
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
语句移出循环体。 否则,只要到达该行,循环就会终止。
PS3 =“什么是操作?”declare -A op =([add] ='+'[subtract] =' – '[multiply] ='*'[divide] ='/')
而真实的; 请阅读-p“第一个数字是什么?”n1 read -p“第二个数字是什么?”n2在“$ {!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”)“done
这将计算使用多达4位小数(如果需要),工作不带引号。
calc () { echo "scale=4;$*" | bc -l }
唯一的缺点是,你必须转义*
,否则shell将使用它来扩展文件。
用法:
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
#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