2013-02-26 458 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