1

我正在尝试制作一个 switch 语句以在 tcsh 中工作,但我不确定它为什么不起作用。我在屏幕上显示一个菜单,如果选择该选项,它会显示价格,然后返回顶部并重复,直到选择退出选项。

#!/bin/csh

clear          
echo -n "Petes A Pizza                 "        
echo -n "                 Menu           "      
echo -n "                                     " 
echo -n "                 Make a selection    " 
echo -n "                         "     
echo -n "               A. Speciality Pizza     "     
echo -n "               B. Veggi Lovers Pizza   "     
echo -n "               C. Meat Lovers Pizza    "       
echo -n "               D. Hawaiian Pizza       "       
echo -n "               E. Cheese Pizza         "     
echo -n "               F. Exit                 "     

set a = $<                      

switch ($a)                    

        case [A] :        
 set A = ((7.99 + 0.07))
                echo $A
                sleep 5
                goto top
        case [B] :              #they choose option 2
                set B = ((8.99 * 0.07) + 8.99)
                echo $B
                sleep 5
                goto top
        case [C] :              #they choose option 3
                set C = ((6.99 * 0.07) + 6.99)
                echo $C
                sleep 5
                goto top
        case [D] :              #they choose option 4
                set D = ((8.49 * 0.07) + 8.49)
                echo $D
                sleep 5
                goto top
        case [E] :              #they choose option 5
                set E = ((3.99 * 0.07) + 3.99)
                echo $E
                sleep 5
        case [F] :             
                exit 0          
                breaksw         

        endsw
end
4

1 回答 1

3

这里有一些建议应该足以帮助您使其正常工作。

更改#!/bin/csh#!bin/csh -f。这告诉 shell不要读取您的~/.cshrc文件,这样可以节省时间并避免混淆。(例如,如果您不小心编写了依赖于您在 中定义的别名的代码,那么.cshrc您的脚本将不适用于其他任何人。)

如果您必须清除屏幕,clear命令就是执行此操作的方法——但为什么呢?如果我想在运行你的脚本之前清除我的屏幕,我会自己做,非常感谢。如果我的屏幕上有我不想丢失的信息,当你的脚本决定为我删除它时,我会很生气。

将所有echo -ns 更改为 just echo。该-n选项告诉echo打印其输出而没有尾随换行符;您的整个菜单将打印在一行上。

案例标签中的方括号是不必要的。case A :与 的意思相同case [A] :。请注意,您要求用户以大写形式提供输入,这可能不方便。

set A = ((7.99 + 0.07))
...
set B = ((8.99 * 0.07) + 8.99)

这些是不一致的。看起来您正在尝试计算基本价格加上 7% 的销售税。对于案例 B,一个更简单的表达式是8.99 * 1.07

csh 无法识别此(( ... ))语法;我想知道你从哪里得到它的想法。csh 可以使用以下@命令进行算术运算:

@ x = 2 + 2
@ x ++

但它只对整数起作用。该bc命令可以进行浮点计算。你可以这样写:

set B = `echo 'scale=5; 1.07 * 8.99' | bc`

或者,更简单地说:

set B = `echo '1.07 * 8.99' | bc -l

bc -l可能会给你比你想要的更多的数字。 man bc有关该bc命令、其语法及其工作方式的更多信息。请记住,csh 变量的值是字符串,而不是数字。

(我不确定bc是完成这项工作的最佳工具。)

最后,csh 并不是编写脚本的最佳语言。我使用它的时间比我承认的要长,有时我不得不通过反复试验来找出给定语法的行为方式;在许多情况下,语法定义不明确,并且手册页并不总是清楚地说明问题。

推荐阅读: Tom Christiansen 的“Csh Programming Considered Harmful”

于 2013-03-17T23:01:12.070 回答