2013-02-26 273 views
0

所以我正在寫一個計算器c shell腳本,它從文件中讀取數字,然後shell返回答案。例如,在數字文本文件,我將有:csh錯誤「set:No match」。

1129 3100 + 

和我的CSH文件,一旦運行,將返回

Input from line 1 : 1129 3100 + 
ARG1: 1129 
ARG2: 3100 
ARG3: + 
4229 

我的問題是,當我到了28日線的28行的文件,輸出是:

Input from line 28 : 7 4 *= 
set: No match. 

根據我的代碼,我本應該返回:

Input from line 28 : 7 4 *= 
ARG1: 7 
ARG2: 4 
ARG3: *= 
Invalid Input in line 28 

這裏是我的代碼:

#!/bin/csh 
# Usage: Performs math operations 

@ linenum=0 

foreach line ("`cat calc_input.txt`") 
    @ linenum += 1 
    echo "Input from line $linenum : $line" 
    set argv = ($line) 
    set var1 = $1 
    set var2 = $2 
    set var3 = $3 
    echo "ARG1: $var1" 
    echo "ARG2: $var2" 
    echo "ARG3: $var3" 
    switch ($var3) 
      case +: 
        @ ans = $var1 + $var2 
        echo $ans 
      breaksw 
      case -: 
        @ ans = $var1 - $var2 
        echo $ans 
      breaksw 
      case x: 
        @ ans = $var1 * $var2 
        echo $ans 
      breaksw 
      case /: 
        if ($var2 == 0) then 
          echo "Error: Divide by Zero" 
          continue 
        endif 
        @ ans = $var1/$var2 
        echo $ans 
      breaksw 
      case %: 
        @ ans = $var1 % $var2 
        echo $ans 
      breaksw 
      default: 
        echo "Invalid Input in line $linenum" 
      breaksw 
    endsw 
end 

這裏是我要讀的數字

1129 3100 + 
-19 6 + 
9 3 - 
-7 6 - 
9 3/
4 8/
35 6/
12 3 % 
13 3 % 
4 19 % 
11 9 x 
4294967296 1024 x 
-9 7 x 
1024 0/
14 63 << 
1234 5678 >> 
1 2 3 4 + 
1 + 
3 - 
7 x 
12/
91 % 
7 ++ 
3 1 += 
6 2 -= 
4 6 * 
-11 7 * 
7 4 *= 

我只需要擔心+,文件 - ,x,/和%。任何格式不正確的我都會顯示錯誤消息。

感謝您的幫助!

是的,這是一個家庭作業問題,我知道csh是一個可怕的,可怕的事情,大多數人不使用它。告訴我的老師,不是我。

更新:剛剛嘗試將它遇到麻煩的行移動到數字文件中的不同行。它仍然有問題,但每當腳本遇到了它只是發生:

7 4 *= 

所以它不是在文本文件中的位置問題。這是表達的問題。

回答

0

一個語法問題:您缺少默認子句中的一個字符。檢查你的文檔,你應該能夠弄清楚。

考慮到這一點,考慮一下*意味着什麼csh(通配符)。 *=有什麼特別之處?想想你如何限制csh只將它作爲一個角色。

Input from line 27 : -11 7 * 
ARG1: -11 
ARG2: 7 
ARG3: calc_input.txt 

找出爲什麼ARG3是文件名。

Input from line 28 : 7 4 *= 
set: No match. 

該錯誤消息非常具體。看看它。

「這是表達式的問題。」 - 這是關於什麼csh與*。看看globbing。將一行添加到腳本中以指示csh暫停通配會使其工作。

+0

感謝您的回覆。默認情況下是冒號嗎?我剛添加它,它仍然無法工作。 – user2060214 2013-02-26 03:14:17

+0

是的,你明白了。我添加了另一個提示。你應該嘗試把你自己的一些額外的測試用例放在一起 - 例如,如果你有'3 4 Y'會發生什麼? (它應該觸及你的'默認'條款......是嗎?) – Mogsdad 2013-02-26 13:34:33