1

tcsh で動作するように switch ステートメントを作成しようとしていますが、動作しない理由がわかりません。画面にメニューを表示しています。オプションが選択されている場合は、価格が表示され、上部に戻り、終了オプションが選択されるまで繰り返されます。

#!/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ます。これにより、シェルはファイルを読み取らないようになり、時間が節約され、混乱を避けることができます。~/.cshrc(たとえば、で定義したエイリアスに依存するコードを誤って記述した場合、その.cshrcスクリプトは他のユーザーには機能しません。)

画面をクリアする必要がある場合clearは、コマンドを使用してそれを実行できますが、なぜでしょうか? スクリプトを実行する前に画面をクリアしたい場合は、自分で行います。ありがとうございます。失いたくない情報が画面に表示されている場合、スクリプトがそれを消去しようとするとイライラします。

すべてのecho -ns を just に変更しechoます。この-nオプションはecho、末尾の改行なしで出力を印刷するように指示します。メニュー全体が 1 行に印刷されます。

ケース ラベルの角括弧は不要です。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機能の詳細については、 を参照してください。bccsh 変数の値は数値ではなく文字列であることに注意してください。

bcこの仕事に最適なツールかどうかはわかりません。)

最後に、csh はスクリプトを作成するのに最適な言語ではありません。私は認めようとしているよりも何年もそれを使用してきましたが、特定の構文がどのように動作するかを調べるために、試行錯誤に頼らなければならないこともあります。多くの場合、構文は不十分に定義されており、man ページは常に問題を解決するとは限りません。

推奨される読書: Tom Christiansen による「Csh プログラミングは有害であると見なされる」。

于 2013-03-17T23:01:12.070 に答える