2015-10-01 42 views
2

我正在寫一個shell程序,使用while命令來防止被零除,並在用戶輸入99時退出程序。每次運行它我都會得到第二個數字的輸入錯誤反過來也不給我答案。下面是我試圖在這個問題:使用shell除零除

#!/bin/bash 
firstNum=0 
secondNum=0 
answer=0 
while true firstNum != 99, secondNum != 99 do 
read -p "Enter first number" firstNum 
read -p "Enter second number" secondNum 
echo "first num $firstNum" 
echo "second Num $secondNum" 
if ["$secondNum" = "0"] 
then 
    exit 1 
else 
    echo "first number/second Number = $((firstNum/secondNum))" 
    echo "Answer = $answer" 
fi 
do 
exit 
done 

而下面的是錯誤信息,我得到

./example.sh: 10: ./example.sh: [2: not found 

在所有的任何幫助是極大的讚賞。 謝謝

回答

2

看起來像一些拼寫錯誤。

替換此:

if ["$secondNum" = "0"] then 
    exit 1 
then 
    echo "1st number/2nd number = $((firstNum/secondNum))" 
    echo "Answer = $answer" 
fi 

與此:

if [ "$secondNum" = "0" ] 
then 
    exit 1 
else 
    echo "1st number/2nd number = $((firstNum/secondNum))" 
    echo "Answer = $answer" 
fi 

Bash是挑剔。確保then位於下一行,與if不在同一行,您的第3行也有then而不是else

+0

答案然而現在顯示,我仍然得到關於第二個數字原始的錯誤消息。你有什麼想法,爲什麼這可能是? – user5399071

+0

我沒有看到我的任何錯誤,所以也許更新上面的代碼片段,以便我們可以測試它。 – Greg

+0

另外,你的'while'語句對我來說看起來並不熟悉,我會在互聯網上搜索'bash while'來確保你的格式是正確的。 – Greg

2

您的代碼可以簡化

while true; do 
    read -p "Enter first number: " firstNum 
    [[ "$firstNum" -eq 99 ]] && break 

    read -p "Enter second number: " secondNum 
    case "$secondNum" in 
     99) break ;; 
     0) echo "div by zero, try again"; continue ;; 
    esac 

    echo "first number/second Number = $(bc -l <<< "$firstNum/$secondNum")" 
done 

我呼喚bc得到浮點運算。有了shell,你僅限於整數。

<<<是「此處的字符串」,字符串傳遞給卑詩省的標準輸入

1

你的代碼看起來不錯給我,但我改變了POSIX殼體試驗了一下週圍,以測試值小於99,而不是99本身。在我刪除的腳本底部附近有一個流浪的do。 Bash也有[[]]樣式測試語法,您可能想在某些時候切換到這種語法。

#!/bin/bash 

firstNum=0 
secondNum=0 
answer=0 

while [ "$firstNum" -lt 99 -a "$secondNum" -lt 99 ] 
do 
    read -p "Enter first number " firstNum 
    read -p "Enter second number " secondNum 
    printf "first num $firstNum\n" 
    printf "second Num $secondNum\n" 
    if [ "$secondNum" = 0 ] 
    then 
     printf "$secondNum was a zero, exiting!\n" 
     exit 1 
    else 
     printf "first num/second Num = \$(($firstNum/$secondNum))\n" 
     answer=$((firstNum/secondNum)) 
     printf "Answer = $answer\n" 
    fi 
done 

如果你有興趣學習Bash的測試語法[[]](它比POSIX shell的測試功能更強大一點(1)[])這裏是使用它的一個例子:

#!/bin/bash 

firstNum=0 
secondNum=0 
answer=0 

while [[ "$firstNum" < 99 && "$secondNum" < 99 ]] 
do 
    read -p "Enter first number " firstNum 
    read -p "Enter second number " secondNum 
    printf "first num $firstNum\n" 
    printf "second Num $secondNum\n" 
    if [[ "$secondNum" == 0 ]] 
    then 
     printf "$secondNum was a zero, exiting!\n" 
     exit 1 
    else 
     printf "first num/second Num = \$(($firstNum/$secondNum))\n" 
     answer=$((firstNum/secondNum)) 
     printf "Answer = $answer\n" 
    fi 
done 

它可能也建議將測試移動到while循環的主體中,而是使用慣例'while [[1]]'創建連續循環。下面是一個例子這樣做(使用bash測試語法[[]]),並使用bc所以腳本支持浮點運算:

#!/bin/bash 

firstNum=0 
secondNum=0 
answer=0 

while [[ 1 ]] 
do 
    read -p "Enter first number " firstNum 
    read -p "Enter second number " secondNum 
    printf "first num $firstNum\n" 
    printf "second Num $secondNum\n" 
    case "$firstNum" in 
     99) printf "Invalid values\n" 
      exit 1 
      ;; 
    esac 

    case "$secondNum" in 
     99) printf "Invalid values\n" 
      exit 1 
      ;; 
     0) printf "Invalid values\n" 
      exit 1 
      ;; 
    esac 

    answer=$(printf "$firstNum/$secondNum\n" | bc -l) 
    printf "Floating point supported answer using bc: = $answer \n" 
done