unix 및 실습 13장 콘 쉘 프로그래밍 -...

53
13. 프로그래밍 UNIX 실습 1

Upload: duongnhu

Post on 20-Oct-2018

226 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

13장. 콘 쉘 프로그래밍

UNIX 및 실습

•1

Page 2: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

학습목표

다양한 쉘 변수를 이해하고 활용하는 방법을 익힌다.

스크립트 파일 안에서 사용자 입력을 받아 처리하는 방법을 익힌다.

산술, 비교, 논리, 비트 연산자와 문자열 테스트, 파일 테스트를 활용하는 방법을 익힌다.

조건문과 반복문의 사용 방법을 익힌다.

함수를 이용해 스크립트를 작성하는 방법을 익힌다.

스크립트의 실행 오류를 찾아서 수정하는 방법을 익힌다.

•2

Page 3: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

Section 01 쉘 스크립트

스크립트?

인터프리터라 불리는 다른 프로그램에 의해 실행되는 프로그램

Perl, 자바 스크립트, Tcl/Tk,…

쉘 스크립트

쉘이 실행하는 프로그램

유닉스 명령 + 쉘이 제공하는 프로그램 구성 요소

쉘 스크립트 파일 이름은 키워드나 앨리어스 ,내장 명령과 같은

이름을 쓰지 않는 것이 바람직 함

예 : test_script

•3

#!/bin/ksh

# My First Script Program

print I love UNIX !

pwd

Page 4: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 스크립트 실행하기

스크립트 실행 방법

쉘을 실행하면서 인자로 스크립트 이름 지정

파일을 직접 실행

•4

telnet hanbitbook.co.kr

$ ksh test_script

I love UNIX!

/export/home/user1/unix/ch13

$

telnet hanbitbook.co.kr

$ chmod +x test_script

$ test_script

I love UNIX!

/export/home/user1/unix/ch13

$

Page 5: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 스크립트 종료하기 - exit

스크립트의 종료

파일의 마지막 명령을 실행

exit 실행

종료 상태

$? 변수에 저장

예 : test_exit

•5

exit [종료상태]

#!/bin/ksh

#test_exit : exit and $?

# Test Script

exit 20

telnet hanbitbook.co.kr

$ test_exit

$ print $?

20

$

Page 6: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 스크립트 파일 내용 - #!

스크립트를 실행할 프로그램 지정

파일의 가장 처음에 위치

예 : test_sharp

예 : test_sharp2

•6

#!/bin/more # test_sharp: 스스로를 출력하는 스크립트 # 이 스크립트를 시행시키면 자기 자신을 화면에 출력합니다. # 주석문도 모두 출력되지요. print 이 문장도 출력됩니다.

#!/bin/rm # test_sharp2: 자기 자신을 지우는 스크립트 # 이 스크립트를 실행시키면 이 파일이 지워집니다. WHATEVER=65 print 이 부분은 절대로 출력되지 않을 겁니다. exit $WHATEVER # exit 문도 실행되지 않지요.

Page 7: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 스크립트 파일 내용 - 주석

주석은 #으로 시작

프로그램의 설명

행 전체 또는 행의 일부를 주석으로 처리

예 : test_sharp2

•7

#!/bin/rm # test_sharp2: 자기 자신을 지우는 스크립트 # 이 스크립트를 실행시키면 이 파일이 지워집니다. WHATEVER=65 print 이 부분은 절대로 출력되지 않을 겁니다. exit $WHATEVER # exit 문도 실행되지 않지요.

Page 8: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 스크립트 파일 내용 – 쉘 명령어

쉘이 실행할 수 있는 모든 명령어 사용 가능

여러 명령을 반복 수행해야 할 때 파일로 작성하여 실행

예 : find_script

실행 결과:

•8

#!/bin/ksh # find_script : /bin, /usr/bin에 있는 쉘 스크립트 검색 cd /bin file * | grep “스크립트” cd /usr/bin file * | grep “스크립트”

telnet hanbitbook.co.kr

$ find_script alias:실행할 수 있는 /bin/ksh 스크립트 appletviewer:실행할 수 있는 /bin/ksh 스크립트 arch:실행할 수 있는 /usr/bin/sh 스크립트 basename:실행할 수 있는 /usr/bin/sh 스크립트

Page 9: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 스크립트 파일 내용 – 쉘

프로그램 각 쉘이 제공하는 프로그램을 위한 구문

쉘 변수, 인자처리, 각종 연산자, 제어문 등 포함

•9

telnet hanbitbook.co.kr

$ cat -n /etc/init.d/nfs.server | more 1 #!/sbin/sh

2 # (중략) 12 case "$1" in 13 'start') 14 # Clean up old /etc/dfs/sharetab – remove all nfs entries 15 16 if [ -f /etc/dfs/sharetab ] ; then 17 /usr/bin/awk '$3 != "nfs"' /etc/dfs/sharetab | \ 18 /usr/bin/sed -e 's/ / /' >/tmp/sharetab.$$ (중략)

--계속--(26%)

Page 10: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

Section 02 쉘 변수 사용하기

변수값 활용하기

•10

형식 의미

$name name의 값으로 대체

$(name) name의 값으로 대치. 변수 이름이 다른 구문과 인접해 있을 때 사용

${name-word} name이 정의되어 있으면 그 값을, 그렇지 않으면 word값 사용

${name+word} name이 정의되어 있으면 word 값을 사용

${name=word} name이 정의되지 않았으면 word를 대입하고 그 값 사용

${name?word} name이 정의되어 있으면 그 값을 사용하고 그렇지 않으면 word 출력 후 종료

Page 11: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 변수 사용하기

사용 예제

•11

telnet hanbitbook.co.kr

$ test=test

$ print $test

test

$ print ${test}

test

$ print ${test-word}

test

$ print ${test1-word}

word

$ print ${test+word}

test

$ print ${test=word}

test

$ print ${test1=word}

word

$ print ${test?word}

test

$ print ${test2?word}

ksh: test2: word

$

1) test 변수에 "test" 문자열 저장 2) test 변수값 출력 3) test 변수값 출력 4) test 변수가 정의되어 있으므로 그 값을 출

력 5) tset1 변수가 없으므로 문자열 word 출력 6) test 변수가 정의되어 있으므로 word 출력 7) test가 정의되어 있으므로 그 값을 출력 8) test1 변수가 없으므로 word를 그 값으로

저장 9) tset 변수가 정의되어 있으므로 그 값 출력 10) tset2 변수가 없으므로 word 출력 후 스크

립트 종료

Page 12: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 변수 문자열 처리

변수의 값이 문자열 일 때 문자열 내 패턴을

찾아 일부분을 제거하는 방법 출력

•12

표현식 기능

${vairable%pattern} variable의 뒤부터 패턴과 일치하는 첫 번째 부분을 찾아서 제거

${variable%%pattern} variable 값의 뒤부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거

${variable#pattern} variable 값의 앞부터 패턴과 일치하는 첫 번째 부분을 찾아서 제거

${variable##pattern} variable 값의 앞부터 패턴과 일치하는 가장 큰

부분을 찾아서 제거

Page 13: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

쉘 변수 문자열 처리 사용법

%

#

•13

telnet hanbitbook.co.kr

$ path1"/usr/bin/local/bin"

$ print ${path1%/bin}

/usr/bin/local

$ print ${path1%%/bin*}

/usr

$

telnet hanbitbook.co.kr

$ path2="/export/home/user1/.profile"

$ print ${path2#/export/home}

/usr1/.profile

$ print ${path2##*/}

.profile

$

Page 14: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

변수 속성 지정 - typeset

변수의 속성

대소문자, 폭, 정렬 방향, 읽기 전용, 정수타입

•14

명령 기능

typeset 모든 변수 출력

typeset –x export 된 모든 변수 출력

typeset a b c 지역변수 a b c 정의

typeset –r d 변수 d를 읽기 전용으로 지정

typeset –i num num 변수에는 정수만 저장

typeset –u name name의 값을 대문자로 변환하여 저장

typeset –l name name의 값을 소문자로 변환하여 저장

typeset –L# name name의 값의 처음 #개 문자만 남기고 삭제

typeset –R# name name 값의 마지막 #개 문자만 남기고 삭제

typeset –z# name name을 #개 문자로 구성된 문자열을 만들고 끝에 null문자 추가

Page 15: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

명령행 인자 처리

명령행 인자

스크립트를 실행할 때 인자로 주어진 값

위치 매개 변수

명령행 인자를 저장하는 스크립트 변수

인자의 위치에 따라 이름이 정해짐

•15

명령행 인자 의미

$0 쉘 스크립트의 이름

$1 - $9 명령행에 주어진 첫번째부터 9번째까지 인자

$(10) 10번째 인자

$# 전체 인자 개수

$* 모든 인자

$@ $*과 같은 의미

“$*” “$1 $2 $3”

“$@" “$1” “$2” “$3”

$? 최근 실행된 명령의 종료값

Page 16: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

명령행 인자처리

예 : test_position

실행 결과:

•16

#!/bin/rm # test_position: 명령행 인자를 테스트 print '$# : ' $# print $1 $2 $3 print '$* : ' $* print '$@ : ' $@ print '$? : ' $?

telnet hanbitbook.co.kr

$ test_position one two three

$# : 3

one two three

$* : one two three

$@ : one two three

$? : 0

$

Page 17: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

명령행 인자처리 - shift

위치 매개변수의 항목을 지정한 개수만큼 왼쪽으로 이동

개수를 지정하지 않으면 하나씩 이동

예 : test_shift

•17

shift [n]

#!/bin/ksh # test_shift: shift 명령 테스트 print $* shift print $* shift print $*

telnet hanbitbook.co.kr

$ test_shift 1 2 3 4 5 1 2 3 4 5 2 3 4 5 3 4 5 $

Page 18: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

Section 03 사용자로부터 입력 받기 -

read 쉘 내장 명령으로 터미널이나 파일로부터

입력 처리

사용 형식

•18

형식 의미

read x 표준입력에서 한 행을 입력 받아 x에 저장

read first last 표준입력에서 한 행을 입력받아 첫번째 단어를 first에 저장하고 나머지 모두를 last에 저장

read x?”Input x : ” Input x : 문자열을 표준 오류로 출력하고, 사용자의 입력을 받아서 x에 저장

Page 19: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

입력 받기 - read

예 : test_read

•19

#!/bin/ksh # 키보드 입력 처리를 테스트 하는 스크립트

read x # 아무 메시지 없이 사용자 입력을 기다림 print The value of x is $x # 사용자가 임의의 값을 입력하면 출력

read y?"Input y : " # Input y :를 출력한 후 입력 기다림 print x is $x y is $y # x, y 값 출력

print -n "Please enter your name : " # Please~ 문을 출력. 줄 안바꿈 read first last # 첫 단어는 first, 나머지는 last에 저장 print Hi $first # first name만 출력

Page 20: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

입력 처리 - here 문서

표준 입력을 사용자로부터 직접 받아들이지 않고 자동 처리

TERMINATOR가 입력될 때까지 기술된 부분을 키보드 입력으로 처리

예 : test_here

•20

명령 << TERMINATOR

입력

TERMINATOR

#!/bin/ksh # here 문서 테스트. user1에게 메일을 보냄 mail user1 << END This is a test mail for here document END

Page 21: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

Section 04 연산자

프로그램에서 자료를 처리하는 방법

산술 연산자, 비교 연산자, 논리 연산자, 비트 연산자 제공

수치 연산자 사용시 let 또는 (( )) 사용해야 함

•21

연산자 의미 사용예

- 음수 (단항연산) -5

! 논리 부정(not) (( ! x < y ))

~ 비트 반전 (not) ~y

* / % 곱셈, 나눗셈, 나머지 연산 let y=3 * 5

+ - 덧셈, 뺄셈 let x=x+1

<< >> 비트왼쪽 시프트, 비트오른쪽 시프트 (( y = x << 3 ))

<= >= < > == != 비교 연산 (( x < y ))

& ^ | 비트 AND, XOR, OR 연산 let “z = x ^ y”

&& || 논리 AND, OR (( x<y || x==3 ))

= 변수값 지정 let z=1

*= /= %= += == <<=

>>= &= ^= |= 단축 연산 let z+=1

Page 22: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

연산자

사용 방법

•22

telnet hanbitbook.co.kr

$ a=5 $ print $a 5 $ let a = 20 ----> let에서 공백을 사용 못함 ksh: =: 할당하려면 lvalue가 필요합니다 $ let “a = 20” ----> 공백을 포함하려면 " " 사용해야 함 $ print $a 20 $ (( a = 30 )) ----> (( ))에서는 공백 사용 가능 $ print $a 30 $ a=$a*5 ----> let이나 (( ))을 사용하지 않으면 문자열로 처리 $ print $a 30*5 $ print $((5*6)) ----> 계산 결과를 바로 출력할 수 있음 30 $ print $(( ! 2 + 3 * 4 )) ----> 우선순위에 따라 ! 먼저 수행. 2는 0이 됨. 12 $ print $(( 2 << 1 )) ----> 왼쪽 shift는 *2와 같음. 2번 shift는 *4 4 $ print $(( 3 ^ 5 )) ----> XOR 연산 결과 6 $

Page 23: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

Section 05 제어문

프로그램내의 문장 실행 순서를 제어하는 것

선택적 실행문 프로그램 실행문을 조건에 따라 선택적으로 실행

if , select

반복 실행문 프로그램 실행문을 정해진 횟수나 조건에 따라 반복 실행

while , do , for

•23

순차적 수행 선택적 수행 반복 수행

조건 문장 1

문장 2

No(False)

Yes(True)

문장 1

문장 2

조건 문장 1

문장 2

No(False)

Yes(True)

Page 24: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

#!/bin/ksh # test_if: if 문을 테스트하는 스크립트 read x?"Input x : " # x 값을 입력 받음 read y?"Input y : " # y 값을 입력 받음 if (( x < y )) then print x is less than y $x $y else print y is less than x $y $x fi

선택적 실행문 - if~then~else 주어진 조건의 참, 거짓 여부에 따라 명령 실행

예 : test_if

•24

if 조건명령 then 명령 [ else 명령 ] fi

엄밀히 말하면 조건 명령을 실행하여 그 종료값이 0이면 then다음의 명령을 실행하고, 0이 아닌 값이면 else 다음의 명령을 실행한다.

Page 25: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

선택적 실행문 - if~then~elif~else

조건이 실패일 때 새로운 분기 명령 실행

예 : test_elif

•25

#!/bin/ksh # test_elif: if-elif 문 테스트 read score?"점수를 입력하세요 : " if (( $score > 90 )) then print 훌륭합니다. elif (( $score >= 80 )) then print 잘 하셨네요 else print 좀 더 열심히 하세요 fi

if 조건명령1 then 명령 elif 조건명령2 명령 else 명령 fi

Page 26: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

조건 테스트 - 문자열 연산자

조건 명령에 사용하는 문자열 연산자

내장 명령 [[ ]] 사용

•26

문자열연산자 동작

string = pattern

string == pattern string이 pattern과 일치. = 연산자 양쪽에 공백

string != pattern string이 pattern과 일치하지 않음

string1 < string2 string1이 string2보다 사전에서 먼저 나오면 참

특수기호의 경우 아스키 코드값으로 비교

-z string string의 길이가 0

-n string string의 길이가 0이 아님

Page 27: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

조건 테스트 - 문자열 연산자

예 : test_string

•27

#!/bin/ksh # test_string: 문자열 테스트 스크립트 read answer?"Are you OK (y/n) ? " # answer 변수에 값 저장 if [[ $answer = [Yy]* ]] # 문자열 비교. y로 시작하는 문자열인가 then print Happy to hear it. # y로 시작하면 else print That is too bad. # y로 시작하지 않으면 fi

Page 28: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

조건 테스트 - test 플래그

파일 관련 테스트

콘쉘 전용 플래그

•28

test 플래그 기능

-a file 파일이 존재

-e file 파일이 존재

-L file 심볼릭 링크 파일

-O file 사용자가 file의 소유자

-F file 사용자의 그룹 ID가 파일의 그룹 ID와 같음

-S file 소켓 파일

Page 29: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

조건 테스트 - test 플래그

본쉘과 공통 사용 플래그

•29

test 플래그 기능

-r file 읽기 가능

-w file 쓰기 가능

-x file 실행 가능

-f file 일반 파일

-d file 디렉토리 파일

-b file 블록 장치 특수 파일

-c file 문자 장치 특수 파일

-p file 파이프 파일

-u file setuid 권한 부여 파일

-g file setgid 권한 부여 파일

-k file sticky bit 접근 권한 부여 파일

-s file 파일의 크기가 0이 아님

Page 30: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

조건 테스트 - test 플래그

예 : test_file

•30

#!/bin/ksh # test_file: 파일 연산자 테스트 read file?"파일 이름을 입력하세요 : " if [[ ! -a $file ]] then print 해당 파일이 존재하지 않습니다. 파일 이름을 다시 확인하세요. elif [[ -f $file ]] then print 일반 파일입니다. elif [[ -d $file ]] then print 디렉토리 파일입니다. else print 특수 파일입니다. fi

telnet hanbitbook.co.kr

$ test_file 파일 이름을 입력하세요 : /dev/null 특수 파일입니다 $ test_file 파일 이름을 입력하세요 : /etc/passwd 일반 파일입니다 $ test_file 파일 이름을 입력하세요 : . 디렉토리 파일입니다 $

Page 31: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

선택적 실행문 - case 문

주어진 변수의 값에 따라 실행할 명령 따로 지정

변수의 값이 value1 이면 value1부터 ;;을 만날 때까지 명령 실행

값의 지정에 특수기호, | (or연산자) 사용 가능

일치하는 값이 없으면 기본값인 * 부터 실행

•31

case 변수 in value1) 명령 ;; value2) 명령 ;; *) 명령 ;; esac

Page 32: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

선택적 실행문 - case 문

예 : test_case

•32

#!/bin/ksh # test_case: case 테스트 스크립트 read cmd?"명령을 선택하세요 : " case $cmd in [0-9]) # 0부터 9까지 임의의 숫자 date ;; [aA-C]*) # 소문자 a, 대문자 A,B,C로 시작하는 임의의 문자열 pwd ;; "cd" | "CD") # cd 또는 CD print $HOME ;; *) print Usage : 명령을 선택하세요 ;; esac

Page 33: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복 실행문 - for

리스트 안의 각 값들에 대해 지정한 명령을 순차 실행

예 : test_for

•33

for 변수 in list

do

명령

done

Tip] list 대신 $(< file)을 사용하면 외부 파일의 내용을 입력으로 받아서 처리!

#!/bin/ksh

# test_for: for 테스트 스크립트 for num in 0 1 2 do print number is $num done

telnet hanbitbook.co.kr

$ test_for

number is 0

number is 1

number is 2

$

Page 34: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복 실행문 - for

외부 파일 내용 참조

예 : test_for2

•34

#!/bin/ksh # test_for2: 외부 파일 입력 처리 for person in $(< list) # `cat list`와 동일 do mail $person < letter # 현재 디렉토리에 있는 파일 print ${person}에게 메일을 보냈습니다. done print 모든 메일을 보냈습니다.

Page 35: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복 실행문 - for

명령행 인자 처리 가능

예 : test_for3

•35

#!/bin/ksh # test_for3: 명령행 인자 처리 for person in $* do mail $person < letter print ${person}에게 메일을 보냈습니다. done print 모든 메일을 보냈습니다.

Page 36: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복 실행문 - while 조건 명령이 정상 실행되는 동안 명령 반복

예 : test_while

•36

while 조건 명령

do

명령

done #!/bin/ksh # test_while: while을 이용해 1부터 10까지을 구하는 스크립트 count=1 sum=0 while (( count <= 10 )) do (( sum += count )) let count+=1 done print 1부터 10까지의 합 : $sum

telnet hanbitbook.co.kr

$ test _while

1부터 10까지의 합 :

55

$

Page 37: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복실행문 – while case 결합 예

•37

#!/bin/ksh # test_while2: while을 이용해 pwd, date,명령 실행, quit 입력시 종료 go=1 # while 종료를 알리는 변수 while (( go )) do print –n 명령을 입력하세요 \( pwd, date, quit \) : read cmd case $cmd in pwd) pwd ;; date) date ;; quit) go=0 # 반복 종료 ;; *) print 잘못 입력하셨습니다. print pwd, date, quit 중에서 선택하세요. ;; esac done

Page 38: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복실행문 – while shift 결합 예

•38

#!/bin/ksh # test_while3: 명령행 인자 처리 while (( $# > 0 )) # 명령행 인자가 남아있으면 do print $1 # 각 명령행 인자에 대해 처리할 작업 기술 shift done

Page 39: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

#!/bin/ksh # test_until: 지정한 사용자가 로그인하면 알리는 스크립트 read person?"로그인 이름:" # 유저 이름을 person에 저장 until who | grep $person # > /dev/null do sleep 5 # 유저가 접속 중이 아니면 5초 쉼 done print "\007" # beep. 삑 소리를 냄

반복 실행문 - until 조건 명령이 정상 실행될 때까지 명령 반복

예 : test_until

•39

until 조건 명령

do

명령

done

Page 40: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복 실행문 - select

메뉴를 생성할 수 있는 반복 실행문

list에 지정한 항복을 선택 가능한 메뉴로 만들어

화면에 출력

각 항목에 자동 부여된 번호 선택 가능

사용자 입력은 select와 in 사이에 지정된 변수에 저장

보통 case 문과 결합하여 입력 값 처리

•40

select 변수 in list

do

명령

done

Page 41: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

반복 실행문 - select

예 : test_select

•41

#!/bin/ksh # test_select: 사용자 입력에 따라 pwd,date 명령실행. PS3="명령을 입력하세요 : " select cmd in pwd date quit do case $cmd in pwd) pwd ;; date) date ;; quit) break ;; *) print 잘못 입력하셨습니다. 번호를 선택하세요. ;; esac REPLY= done

telnet hanbitbook.co.kr

$ test _select

1) pwd

2) date

3) quit

명령을 입력하세요 : 1

/export/home/user1/unix/ch13

1) pwd

2) date

3) quit

4) 명령을 입력하세요 : 3

$

Page 42: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

continue

루프 안에서 사용

이후 실행 순서를 무시하고 루프의 처음으로 돌아가는 명령

예 : test_cont

•42

#!/bin/ksh # test_cont: continue 테스트 for person in $(< list) # `cat list`와 동일 do if [[ $person == sjyoun ]] then continue fi mail $person < letter print ${person}에게 메일을 보냈습니다. done print 모든 메일을 보냈습니다.

Page 43: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

실습과제

사용자로부터 점수를 입력받아 등급을 출력하는 일을 반복하는

스크립트 작성

A+, A, B+, B, C+, C, D+, D, F 처리

잘못된 점수는 오류 메시지 출력

계속 할 것인지 여부를 물어서 y또는 Y 인 경우 계속하고, 아니면 그동안

정상적으로 처리한 점수들 수와 평균값 출력 후 종료

임의 개수의 명령행 인자들로, 수행할 명령들을 받아들여서 차례대로

실행하고 그 결과값이 0이면 “정상종료”, 그렇지 않으면 “비정상

종료”라는 메시지를 출력하는 스크립트 작성

실행 예 : ex2 pwd ls who w

select 를 이용하여 프로그래머가 정한 5개 이상의 명령 중 하나를

선택하여 수행하는 스크립트 작성 (명령 중 하나는 반복문을

빠져나오는 break이어야 함)

•43

Page 44: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

Section 06 함수

함수 : 하나의 목적으로 사용되는 명령들의 집합

앨리어스와의 차이점

조건에 따라 처리 가능

인자 처리 가능

예 : trash

•44

function 함수이름

{

명령들

}

telnet hanbitbook.co.kr

$ mkdir ~/.TRASH $ function trash { > mv $* ~/.TRASH > } $

Page 45: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

함수 호출

정의된 함수 확인

함수 호출

•45

telnet hanbitbook.co.kr

$ touch a b c $ ls a b c $ trash a b c $ ls $ ls ~/.TRASH a b c $

telnet hanbitbook.co.kr

$ functions $ function trash { mv $* ~/.TRASH } $

Page 46: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

함수의 종료 - return

함수 종료 조건

함수 본문 안의 마지막 문장 실행

return 문 실행

지정한 값이 함수의 종료값으로 $?에 저장됨

•46

return [n]

Page 47: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

함수의 종료 - return

예 : add

•47

#!/bin/ksh # 함수 리턴값 테스트 function sum { typeset sum (( sum= $1 + $2 )) return $sum } sum $1 $2 print $1 + $2 = $?

telnet hanbitbook.co.kr

$ add 3 4

3 + 4 = 7

$

Page 48: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

함수의 삭제 - unset

정의된 함수를 삭제

사용법

•48

unset -f 함수명

telnet hanbitbook.co.kr

$ unset -f trash

$ functions

$

Page 49: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

Section 07 디버깅

스크립트 작성 도중 발생한 오류 수정 방법

구문 오류

쉘이 실행도중 구문오류가 발생한 라인번호 출력

실행 오류

오류 메시지 없이 실행이 안되거나 비정상 종료

오류 수정 방법

ksh -x, trap

•49

Page 50: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

디버깅 : ksh -x

가장 간단한 스크립트 실행 오류 수정방법

스크립트의 각 행이 실행될 때마다 화면에 출력됨

•50

telnet hanbitbook.co.kr

$ ksh -x test_while

+ alias l=ls -l

+ count=1

+ sum=0

+ (( count <= 10 ))

+ (( sum+=count ))

+ let count+=1

+ (( count <= 10 ))

+ (( sum+=count ))

+ let count+=1

+ (( count <= 10 ))

(중략)

+ print 1부터 10까지의 합 : 55

1부터 10까지의 합 : 55 $

스크립트의 내용

Page 51: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

디버깅 : trap 이용

지정한 시그널이 스크립트로 전달될 때마다 지정한

명령 실행

스크립트의 명령이 한 줄씩 실행될 때마다 DEBUG

시그널이 스크립트로 전달됨

DEBUG 시그널을 받을 때마다 원하는 변수값 출력 가능

스크립트가 실행되는 도중 변수 값 확인

•51

trap 명령 시그널

Page 52: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

디버깅 : trap 이용

예 : test_trap

•52

#!/bin/ksh # test_trap: trap 테스트 스크립트 Trap ‘print “$LINENO : count=$count “ ’ DEBUG count=1 sum=0 while (( count <= 10 )) do (( sum += count )) let count+=1 done print 1부터 10까지의 합 : $sum

Page 53: UNIX 및 실습 13장 콘 쉘 프로그래밍 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/12u1/UNIX_13.pdf · 쉘 스크립트 파일 내용 – 쉘 명령어 쉘이 실행할 수 있는

실습과제

두 수 중에서 더 큰 값을 돌려주는 max2 함수 작성

세 수 중에서 가장 큰 값을 돌려주는 max3 함수 작성

명령 줄에서 입력을 받아들여 정수가 2개면 max2를,

3개면 max3를 이용하여 가장 큰 값을 돌려주는

스크립트 작성

사용자로부터 희망 id, 이름, 학번, 원하는 쉘을

받아들여 파일(add_user.req)에 추가하는 스크립트 작성

저장 예

abc:”20121234 홍길동”:/usr/ksh

•53