2013-01-17 17 views
0

我想製作一個計算器。用戶輸入數字1,選擇並操作,輸入數字2,然後選擇另一個操作或顯示答案。製作一個可以循環的計算器 - Bash

例如。 1 + 1 = 或 1 + 1 + 2 + 1 =

這兩個都應該是可能的。

read -p "what's the first number? " n1 
PS3="what's the operation? " 
select ans in add subtract multiply divide equals; do 
case $ans in 
    add) op='+' ; break ;; 
    subtract) op='-' ; break ;; 
    multiply) op='*' ; break ;; 
    divide) op='/' ; break ;; 
    *) echo "invalid response" ;; 
esac 
done 
read -p "what's the second number? " n2 
ans=$(echo "$n1 $op $n2" | bc -l) 
printf "%s %s %s = %s\n\n" "$n1" "$op" "$n2" "$ans" 

exit 0 

這是我至今寫的,但我不能工作,如何使人們有可能讓用戶選擇「等於」或環回輪進入另一個操作。任何想法,我可以做我的代碼在這裏?我一整天都被困住了。

  • 我不希望用戶輸入方程本身,我希望他們從列表中選擇。
+0

這個腳本根本不能爲我工作。您是否複製/粘貼了正確的版本? – Avio

+0

read -p「第一個數字是什麼?」n1 PS3 =「操作是什麼?」 select ans in加上減去乘除等於; case $ ans in add)op ='+';打破;; 減去)op =' - ';打破;; multiply)op ='*';打破;; divide)op ='/';打破;; \t \t等於)op = *)echo「invalid response」;; ESAC \t做 讀-p 「什麼是第二個號碼是多少?」 N2 ANS = $(回聲 「$ $ N1運$ N2」 | BC-1) 的printf「%s%s%S =%S \ n \ n「」$ n1「」$ op「」$ n2「」$ ans「 退出0 –

+0

是@svnpenn是正確的複製... –

回答

1

從本質上講,你必須把循環周圍的代碼,所以它讀取一個號碼,然後重複選擇一項操作。建立公式。當用戶選擇「等於」時,跳出外部循環並評估公式。在僞代碼雜交:

formula="" 
while true; do 
    get a number 
    formula+="$number" 
    select an operation 
    case $op in 
    ... 
    equals) break 2 ;; # need to break out of 2 levels, the select and the while 
    esac 
    done 
    formula+="$op" 
done 
ans=$(bc -l <<< "$formula") 
printf "%s = %s\n" "$formula" "$ans" 
0

我會讓用戶在一次閱讀中輸入整個方程。例如

read -p "enter equation" equate 
ans=$(bc -l <<< "${equate%%=*})" 
echo ${equate%%=*} = $ans 

的< < <是這裏字符串,該字符串的內容被饋送到CMD作爲標準輸入。

的%% = *中可能已經放入=後等號的任何事情可變條。

+0

我會使用該方法,但是我想限制他們能夠用例輸入。 –

0
#!/bin/bash 

read -p "what's the first number? " n1 
PS3="what's the operation? " 
select ans in add subtract multiply divide equals; do 
case $ans in 
    add) op='+' ; break ;; 
    subtract) op='-' ; break ;; 
    multiply) op='*' ; break ;; 
    divide) op='/' ; break ;; 
    *) echo "invalid response" ;; 
esac 
done 
read -p "what's the second number? " n2 
ans=$(echo "$n1 $op $n2" | bc -l) 
printf "%s %s %s = %s\n\n" "$n1" "$op" "$n2" "$ans" 

exit 0