【问题标题】:Creating a calculator script创建计算器脚本
【发布时间】:2012-12-30 07:24:03
【问题描述】:

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

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

【问题讨论】:

  • expr "$@" 会更简单。

标签: bash shell unix


【解决方案1】:

为您的~/.bashrc

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

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

【讨论】:

    【解决方案2】:
    #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
    

    【讨论】:

      【解决方案3】:

      请使用以下脚本。

      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
      

      【讨论】:

        【解决方案4】:

        !/bin/bash

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

        虽然是真的;做 阅读 -p “第一个数字是多少?” n1 阅读 -p "第二个数字是多少?" n2 在 "${!op[@]}" 中选择 ans;做 输入 "${!op[@]}";做 [[ $REPLY == $key ]] && ans=$REPLY [[ $ans == $key ]] && 中断 2 完毕 回显“无效响应” 完毕 公式="$n1 ${op[$ans]} $n2" printf "%s = %s\n\n" "$formula" "$(bc -l

        【讨论】:

          【解决方案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
          

          【讨论】:

            【解决方案6】:

            在循环中包装代码

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-27
              • 2015-04-07
              • 2010-09-11
              • 2012-10-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多