Creating a calculator script

后端 未结 7 2131
悲哀的现实
悲哀的现实 2020-12-17 06:18

I am trying to make a calculator with a bash script. The user enters a number, chooses whether they wish to add, subtract, multiply or divide. Then the user enters a second

相关标签:
7条回答
  • 2020-12-17 06:29

    The lesser-known shell builtin command select is handy for this kind of menu-driven program:

    #!/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
    

    Sample output

    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
    

    If I was going to get fancy with bash v4 features and 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
    
    0 讨论(0)
  • 2020-12-17 06:37

    How about this

    calc ()
    {
      (( d = $1 ))
      echo $d
    }
    

    output

    $ calc '6 + 2'
    8
    
    $ calc '6 - 2'
    4
    
    $ calc '6 * 2'
    12
    
    $ calc '6 / 2'
    3
    
    0 讨论(0)
  • 2020-12-17 06:43
    #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
    
    0 讨论(0)
  • 2020-12-17 06:45

    !/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

    0 讨论(0)
  • 2020-12-17 06:45

    Please use the following script.

    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
    
    0 讨论(0)
  • 2020-12-17 06:47

    Wrapping Code in a Loop

    If you just want to wrap your code in a Bash looping construct, and are willing to hit CTRL-C to terminate the loop rather than do something more fancy, then you can wrap your code in a while-loop. For example:

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

    Just make sure to move your unconditional exit statement out of the body of the loop. Otherwise, the loop will terminate whenever it reaches that line.

    0 讨论(0)
提交回复
热议问题