2008-12-16 70 views
4

我有一個bash腳本的問題。我必須使用運算符*來乘。相反,該腳本使用擴展名錯誤地使用腳本本身的名稱作爲運算符。我試着用單引號,但它不工作:(下面的代碼避免擴展,讓

#!/bin/bash -x 

# Bash script that calculates an arithmetic expression 
# NO PRECEDENCE FOR OPERATORS 
# Operators: + - * 

if [ "$#" -lt "3" ] 
then 
    echo "Usage: ./calcola.scr <num> <op> <num> ..." 
    exit 1 
fi 

result=0 
op=+ 
j=0 

for i in "[email protected]" 
do 
    if [ "$j" -eq "0" ] 
    then 
     # first try 
     #result=$(($result $op $i)) 

     # second try 
     let "result$op=$i" 

     j=1 
    else 
     op=$i 
     j=0 
    fi 
done 

echo "Result is $result" 

exit 0 

回答

6

如果「OP」是「*」,它將由外殼腳本,甚至看到它之前擴大。你需要選擇如乘號運算符的其他內容,例如「x」,或者強制用戶將其放在單引號中,或用反斜線將它轉義。

如果練習的條款允許,也許您應該嘗試使用「讀」來獲得從標準輸入表達式,而不是通過命令行讓他們的。

+0

這可能是一個好主意,但我必須做出用戶使用*而不是逃脫形式.. :(因爲這個練習的目標是使用* – gc5 2008-12-16 21:42:17

2

它的工作原理,你只是沒有逃脫*正確。嘗試使用反斜線:

$ ./calcola.scr 2 \* 3 
+ '[' 3 -lt 3 ']' 
+ result=0 
+ op=+ 
+ j=0 
+ for i in '"[email protected]"' 
+ '[' 0 -eq 0 ']' 
+ let result+=2 
+ j=1 
+ for i in '"[email protected]"' 
+ '[' 1 -eq 0 ']' 
+ op='*' 
+ j=0 
+ for i in '"[email protected]"' 
+ '[' 0 -eq 0 ']' 
+ let 'result*=3' 
+ j=1 
+ echo 'Result is 6' 
Result is 6 
+ exit 0 
$ 

雖然,正如保羅湯布林mentioned,它可能會更好地使用x作爲乘法運算符。

+0

是的代碼工作與逃脫* ..我不知道..也許問題是在演習的請求。順便說一句謝謝。:) – gc5 2008-12-16 21:51:06

8

如果您不需要「*擴展」(以下簡稱一般的「通配」)在所有的腳本,只需用「-f」啓動;你也可以在運行時改變它:

[email protected]:/tmp/test$ echo * 
A B 
[email protected]:/tmp/test$ set -f 
[email protected]:/tmp/test$ echo * 
* 
[email protected]:/tmp/test$ set +f 
[email protected]:/tmp/test$ echo * 
A B 
+0

我試圖在腳本中使用它,但它不工作.. :(這是因爲命令「設置」 -f有腳本的運行之前被調用。我無法避免的擴展,因爲腳本時,啓動完成。 – gc5 2008-12-28 15:08:58

相關問題