Presentation is loading. Please wait.

Presentation is loading. Please wait.

제6장 C 쉘(C Shell) 숙명여대 창병모 2009.10.

Similar presentations


Presentation on theme: "제6장 C 쉘(C Shell) 숙명여대 창병모 2009.10."— Presentation transcript:

1 제6장 C 쉘(C Shell) 숙명여대 창병모

2 서론 C 쉘의 새로운 특징 여러 변수 설정 및 접근 방법 프로그래밍 언어
조건 분기, 루프, 인터럽트 처리 이명을 사용한 마춤형 명령어(command customization) 역사(history) 메커니즘 고급 작업 제어(advanced job control)

3 시작 C 쉘의 시작 과정 login shell 로그인할 때 생성된 C 쉘 shell 손수 생성된 C 쉘

4 시작 파일 .login 파일 .cshrc 파일 환경 변수 설정 이명 설정 등 개인적인 설정
echo -n “Enter your terminal type:” set termtype=$< set term=vt100 if (“$termtype” != “ “) set term=“$termtype$” set path=(. /bin /usr/bin /usr/local/bin) stty erase “^?” kill “^U” intr “^C” eof “^D” set history = 40 set prompt = “! %” .cshrc 파일 이명 설정 등 개인적인 설정

5 단순 변수 단순 변수 생성 및 배정 set {name [= word]}* 단순 변수 접근

6 변수: 예 %set flag %echo $flag %set color=red %set name=“Graham Glass”
%echo $name %set … display all local variables %set verb=sing %echo I like $verbing %echo I like ${verb}ing

7 리스트 변수 리스트 변수 생성 및 배정 리스트 변수 접근 리스트 구성
set {name = ( {word}* ) }* % set colors = (red yellow blue) 리스트 변수 접근 리스트 구성 리스트 끝에 새로운 원소 추가 : (list element)

8 리스트 변수: 예 %set colors=(red yellow green) %echo $colors[1]
%set colors[4]=blue %set colors = ($colors blue) %echo $colors %set colors = $colors black %set girls =(sally georgia) %set boys=(harry blair) %set both=($girls $boys)

9 지역 변수(local variable) 사전 정의 지역 변수(Predefined local variables)

10 환경 변수(environment variable)
환경 변수 생성 및 배정 setenv name word 사전 정의 환경 변수(Predefined environment variable)

11 식(Expressions) # echo -n “do you like the C shell ?” set reply = $<
if ($reply == “yes”) then echo you entered yes else if ($reply =~ y*) then echo I assume you mean yes endif

12 스트링 연산

13 산술연산

14 식: 예 %set a =2*2 %@ a = 2 * 2 %echo $a %@ a = $a + $a %set flag = 1
b = ($a && $flag) %echo $b # echo -n “enter the name of file …” set filename = $< if (! (-w “$filename”)) then ...

15 식: 계산 결과

16 파일-관련 식

17 이명(Alias) 명령어 유용한 것 ls ls -F rm rm -i rm mv \!* ~/tomb h history
alias [word [string]] unalias pattern 유용한 것 ls ls -F rm rm -i rm mv \!* ~/tomb h history ls-l ls -l mroe more

18 alias cd 'cd \!*; set prompt= "$cwd \!>" '
이명 이명 공유 서브쉘에서도 이용 가능하기 위해서는 이명 정의를 ".cshrc”에 두어야 한다. 매개변수를 이용한 이명 역사 메커니즘을 이용하여 이미 이명된 명령어의 인자를 사용할 수 있다. alias cd 'cd \!*; set prompt= "$cwd \!>" '

19 역사(History) 명령어 숫자 붙이기 명령어 기억 크기 역사 읽기 % set prompt='\! %'
... \! means the event number 명령어 기억 크기 % set history = 40 % set savehist = 32 % history 역사 읽기 history [-rh] [number]

20 역사: 명령어 재실행

21 제어 구조 프로그래밍 언어처럼 만들기 위해 C Shell script CGI programming in Internet #
foreach color (red yellow green blue) echo one color is $color end

22 제어구조:foreach

23 제어구조: 예 if.csh # echo -n ‘enter a number: ‘ set number = $<
if ($number < 0) then echo negative else if ($number ==0) then echo zero else echo positive endif

24 제어구조:if

25 제어구조:repeat %repeat 2 echo hi there

26 제어구조: 예 menu.csh switch ($reply) # case “1” : date
echo menu test program set stop = 0 while ($stop == 0) cat << ENDOFMENU 1 : print the date 2,3 : print the cwd 4 : exit ENDOFMENU echo -n ‘your choice ?’ ‘ set reply = $< switch ($reply) case “1” : date breaksw case “2”: case “3”: pwd case “4”: set stop = 1 default: echo illegal choice endsw end

27 제어구조:switch

28 제어구조:while

29 제어구조:예 multi.csh %multi.csh 7 # 1 2 3 4 5 6 7 set x = 1
while ($x <= $1) set y = 1 while ($y <= $1) @ v = $x * $y echo -n $v “ “ @ y++ end echo “ “ @ x++ %multi.csh 7

30 샘플 프로젝트: Junk junk -lp {fileName}*
-l option : “.junk”의 현재 상태를 리스트한다. -p option : “.junk” 휴지통 비우기

31 샘플 프로젝트: Junk #! /bin/csh set fileList = ( ) set listFlag = 0
set purgeFlag= 0 set junk = ~/.junk foreach arg ($*) switch ($arg) case “-p” : set purgeFlag = 1 breaksw case “-l” : set listFlag = 1 case -* : echo $arg is an illegal option goto error default: set fileFlag = 1 set fileList = ($fileList $arg) endsw end

32 샘플 프로젝트: Junk @ total = $listFlag + $purgeFlag +$fileFlag
if ($total !=1) goto error if (! (-e $junk)) then ‘mkdir’ $junk endif if ($listFlag) then ‘ls’ -lgF $junk exit 0 if ($purgeFlag) then ‘rm’ $junk/* if ($fileFlag) then ‘mv’ $fileList $junk error: ...

33 예: 파일 수 세기 #count number of files and #directories in argument 1
#or current directory #usage: numfiles [directory] if ($#argv == 0) then set dir = “.” else set dir = $argv[1] endif if (! -d $dir) then echo $0\: $dir not a directory exit 1

34 예: 파일 수 세기 echo $dir\: @ fcount = 0 @ dcount = 0 cd $dir
foreach file (*) if (-f $file) then @ fcount++ else if (-d $file) then @ dcount++ endif end echo $fcount files $dcount dirs

35 향상된 기능들 A shortcut for command re-execution The { } metacharacters
Filename substitution Redirection Built-in

36 명령어 재실행 A shortcut Re-execute the previous command with a slight modification ^pat1^pat2 %cc fil.txt %^fil^file Metacharacter { } a{b,c}d means abd acd %cp /usr/include/{stdio,signal}.h /tmp

37 파일이름 대치 파일 이름 대치 무효화 매치되지 않는 상황 $noglob 변수 set %set noglob
%echo a* p* %set noglob 매치되지 않는 상황 $nonomatch 변수 set %echo a* b* echo: No match. %set nonomatch

38 리디렉션 Redirect stdout Redirect stdout & stderr Redirect only stderr
%cc a.c > errors Redirect stdout & stderr %cc a.c >& errors Redirect only stderr %(cc a.c > out) >& errors Protecting file overwrite %ls -l errors %set noclobber errors: File exists

39 파이프(pipe) Pipe stdout %cc a.c| more Pipe stdout & stderr
command1 | command2 %cc a.c| more Pipe stdout & stderr command1 |& command2 %cc a.c |& more Pipe only stderr (process1>file) |& process2 %(cc a.c > out) |& more

40 기타 Terminating login Source - Control-D - exit - logout %set ignoreeof
Use “logout” to logout %logout Source Execute a script on the original shell %source .login

41 고급 프로그래밍 기법

42 터미널에서 루프 스크립트 없이 터미널에서 while 혹은 foreach 가능 %foreach f (*)
? If (-d $f) continue ? Set fn = `ls -l $f | grep “Dec 13”` ? If ($#fn) rm -I $f ? end

43 인터럽트 처리 onintr label 인터럽트가 발생하면 해당 레이블로 제어 이전 # onintr controlC
while (1) echo infinite loop sleep2 end controlC: echo control-C detected

44 임시파일 생성 필요하면 /tmp에 임시 파일 생성 파일에 대한 유일한 이름 만들기 if ($#argv == 0) then
# csh script to remove blank lines from file if ($#argv == 0) then echo ‘Usage : rmxlf file(s) exit 1 endif set com = $0 set tf = /tmp/$com:t.$$ foreach file ($argv[*]) awk “NR%s == 0” $file > $tf mv $tf $file end

45 자기호출 스크립트 chgmode # Recursive csh to change mode
if ($#argv <2) then echo “Usage: chgmode mode dir” exit 1 endif if (! (-d $argv[2]) then echo “$argv[2] not a directory” exit 1 endif cd $argv[2] chmod $argv[1] * foreach f (*) if (-d $f) then chgmode $argv[1] $f end

46 디버깅 csh -vx script [arguments] % csh -v menu.csh % csh -x menu.csh
% csh -vx menu.csh

47 지침(guideline) 재발명하지 말라. 왜 스크립트를 사용하는가
Unix 명령어로 해결할 수 있는 작업은 C 프로그램보다 C 스크립트로 작성하라. 텍스트 줄을 처리하는 작업 grep, sort, awk, 등 이용 왜 스크립트를 사용하는가 생성하고 유지하기 쉽다. 디버깅도 쉽다.

48 지침 스크립트을 위한 틀 리디렉션과 파이프 사용을 허용하라 인자의 수와 형태를 검사하라 파일과 디렉토리가 있는지 검사하라
적당한 오류 메시지를 내라.

49 효율을 위한 지침 프로세스 생성 경로명 탐색 C 쉘은 외부 명령어를 실행하기 위해 새로운 프로세스를 생성한다.
따라서 foreach f (`ls`)보다는 foreach f (*)을 사용하는 것이 좋다. 경로명 탐색 긴 경로명은 부담이 될 수 있다. cd $dir foreach file ($dir/*) foreach file (*) … … end end

50 효율을 위한 지침 산술 계산 문자 계산 C 쉘은 산술 계산을 위한 언어가 아니다.
쉘 변수의 개별 문자를 접근하는 것은 어렵고 부담이 된다.

51 효율을 위한 지침 파이프를 이용한 명령어 결합 빠른 쉘 시작 %csh -f script [arguments]
%sort tax | grep “business expense” | lpr %grep “business expense” tax| sort | lpr 빠른 쉘 시작 ~/.cshrc 실행하지 않는다 %csh -f script [arguments] csh 스크립트 내에서 #! /bin/csh -f


Download ppt "제6장 C 쉘(C Shell) 숙명여대 창병모 2009.10."

Similar presentations


Ads by Google