2013-12-14 42 views
1

我該如何讓這段代碼工作,以便乘以「*」和mod「%」不會得到錯誤信息?我在想是因爲它們對殼有特殊的意義。我將如何拿走它?Linux特殊shell的含義問題

#!/bin/bash 

echo "Enter Number Operator Number" 
echo "[Operators +, -, /, *, %]" 
echo -n " ---> " 

read num1 op num2 

case $op in 

    +) printf "$num1 + $num2 = %d\n" `expr $num1 $op $num2` 

    ;; 

    -) printf "$num1 - $num2 = %d\n" `expr $num1 $op $num2` 

    ;; 
    /) printf "$num1/$num2 = %d\n" `expr $num1 $op $num2` 

    ;; 

    \*) printf "$num1 * $num2 = %d\n" `expr $num1 $op $num2` 

    ;; 
    %) printf "$num1 % $num2 = %d\n" `expr $num1 $op $num2` 

    ;; 

    *) echo "Bad Operator: $op choose [+, -, *, /, %]" 

    ;; 

esac 
+0

引用所有變量,例如' 「$ OP」'。 – Barmar

回答

1

你應該總是給你的變量,除非你特別想他們經過分詞和通配符。

case "$op" in 
    +) printf "$num1 + $num2 = %d\n" `expr "$num1" "$op" "$num2"` 
    ;; 
    -) printf "$num1 - $num2 = %d\n" `expr "$num1" "$op" "$num2"` 
    ;; 
    /) printf "$num1/$num2 = %d\n" `expr "$num1" "$op" "$num2"` 
    ;; 
    \*) printf "$num1 * $num2 = %d\n" `expr "$num1" "$op" "$num2"` 
    ;; 
    %) printf "$num1 % $num2 = %d\n" `expr "$num1" "$op" "$num2"` 
    ;; 
    *) echo "Bad Operator: $op choose [+, -, *, /, %]" 
    ;; 
esac 
+1

謝謝,那是問題所在 – user3101059

1

最簡單的就是使用(())操作符。

你行應該是這樣的:

printf "$num1 + $num2 = %d\n" $((expr $num1 $op $num2)) 

而且你不會有不帶引號的變量的問題。 :)

3

由於算術展開使用$(()),你的整個腳本可以減少到這一點:

#!/bin/bash 

echo "Enter Number Operator Number" 
echo "[Operators +, -, /, *, %]" 
echo -n " ---> " 

read num1 op num2 

case "$op" in 
    +|-|\*|/|%) echo "$num1 $op $num2 =" $((num1 $op num2)) ;; 
    *) echo "Bad Operator: $op choose [+, -, *, /, %]" ;; 
esac 

您可以在man bash算術展開部分閱讀更多關於這一點。