2013-03-17 4 views
0

tcsh에서 작동하는 switch 문을 만들려고하는데 왜 작동하지 않는지 잘 모르겠습니다. 화면에 메뉴를 표시하고 옵션을 선택하면 가격을 표시 한 다음 맨 위로 돌아가서 종료 옵션을 선택할 때까지 반복합니다.csh의 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 
+2

문제는 당신이 :)보기 [이] (http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/) Wikipeda] (HTTP 시작으로 csh를 사용하고 있다는 점이다 '보다는'의 경우 A : : /en.wikipedia.org/wiki/C_shell#switch_statement)는 좋은 왜'의 경우 [A]를 사용하는 구문 –

+1

의 예를 가지고'? 왜 모든 출력을 한 줄에 출력 할 수있는'echo -n'을 사용하고 있습니까? 'top' 레이블이 없습니다. –

+0

감사합니다. 케이스 A로 변경했습니다. 숫자 및 기타 정보는 인쇄하지만 계산은 끝내기 때문에 계산을 수행하는 데 문제가 있습니다. – user2133534

답변

2

여기에 몇 가지 제안 사항이 있습니다.

#!/bin/csh에서 #!bin/csh -f으로 변경하십시오. 그러면 쉘에 ~/.cshrc 파일을 읽지 않고 파일은 읽을 수 없으므로 시간이 절약되고 혼동을 피할 수 있습니다. (당신이 실수로 예를 들어, .cshrc에 정의한 별칭에 따라 코드를 작성하는 경우, 스크립트는 다른 사람을 위해 작동하지 않습니다.)

당신이 해야가 명확 화면에서 clear 명령이있는 경우 그것을하는 방법 - 그러나 왜? 스크립트를 실행하기 전에 화면을 지우려면 직접 해보십시오. 고맙습니다. 내 화면에 잃어 버리고 싶지 않은 정보가있는 경우 스크립트에서 나를 지우겠다고 결정하면 짜증이납니다.

echo -n을 모두 echo으로 변경하십시오. -n 옵션은 echo에 후행 줄 바꿈없이 출력물을 출력하도록 지시합니다. 전체 메뉴가 한 줄에 인쇄됩니다.

대소 문자 라벨의 대괄호는 필요하지 않습니다. case A :case [A] :과 동일한 의미입니다. 사용자는 대문자로 입력해야하므로 불편할 수 있습니다.

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

이는 서로 일치하지 않습니다. 기본 가격과 7 %의 판매 세를 계산하려는 것 같습니다. case 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는 당신에게 더 많은 숫자를 제공 할 수 있습니다 당신은 뭔가를 작성할 수 있습니다. bc 명령, 구문 및 작동 방식에 대한 자세한 내용은 man bc을 참조하십시오. csh 변수의 값은 숫자가 아니라 문자열이라는 것을 기억하십시오.

는 (나는 bc이 일에 가장 적합한 도구입니다 확실하지 않다.)

마지막으로, CSH 스크립트 작성을위한 최고의 언어가 아닙니다. 나는 내가 인정하는 것보다 더 오랫동안 그것을 사용 해왔고, 주어진 구문이 어떻게 행동 할 것인가를 알아 내기 위해 때로는 시행 착오에 의지해야만한다. 문법은 많은 경우에 잘 정의되어 있지 않으며, 맨 페이지가 항상 내용을 명확하게 해주는 것은 아닙니다.

연구 교재 : "Csh Programming Considered Harmful", 톰 크리스티안에 의해./: