• 검색 결과가 없습니다.

13장. 배시 쉘 프로그래밍

N/A
N/A
Protected

Academic year: 2023

Share "13장. 배시 쉘 프로그래밍"

Copied!
52
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

13장. 배시 쉘 프로그래밍

UNIX 및 실습

(2)

학습목표

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

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

 다양한 연산자와 문자열 테스트, 파일 테스트를 활용하는 방법을 익힌다

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

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

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

(3)

01. 쉘 스크립트

 스크립트?

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

 자바 스크립트, Perl, 파이썬,…

 쉘 스크립트

 쉘이 실행하는 프로그램

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

 쉘 스크립트 파일 이름은 키워드나 앨리어스 ,내장 명령과 같은 이름을 쓰지 않는 것이 바람직함

쉘 명령 실행 순서 : 앨리어스 → 키워드(if, while, until 등) → 함수 → 내장 명령(cd, echo 등) → 스크립트, 유틸리트 등 PATH 경로에 있는 실행

가능한 파일

(4)

쉘 스크립트 만들기

 vi 에디터로 편집

 예 : test_script

#!/bin/bash

# My First Script Program print I love UNIX !

pwd

(5)

쉘 스크립트 실행하기

 스크립트 실행방법

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

 파일을 직접 실행

ssh lily.mmu.ac.kr

$ bash test_script I love UNIX!

/home/user1/unix/ch13

$

ssh lily.mmu.ac.kr

$ chmod +x test_script

$ ./test_script I love UNIX!

/home/user1/unix/ch13

$

PATH 환경 변수에 현재 디렉토리 (.)가 포함되어 있지 않으면 ./를

꼭 지정해야 함!!

(6)

쉘 스크립트 종료하기 - exit

 스크립트의 종료

 종료 상태를 $? 변수에 저장

 사용 예 : test_exit

exit [ 종료상태 ]

스크립트가 종료되는 경우?

파일의 마지막 명령을 실행 exit 문 실행

#!/bin/bash

#test_exit : exit과 $? 를 테스트하는 프로그램

exit 20 텔넷 cookook.co.kr

$ test_exit

$ echo $?

20

$

(7)

스크립트 파일의 구성요소 - #!

 매직 넘버

 파일의 가장 처음에 위치

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

 각 쉘마다 제공하는 스크립트 언어의 문법이 조금씩 다르므로, 이 스크립트를 실행할 쉘을 지정해 주어야 올바로 실행됨

 쉘이 아닌, 다른 실행 가능한 명령을 지정해 주어도 됨

 예 : test_sharp

#!/bin/more

# test_sharp: 스스로를 출력하는 스크립트

# 이 스크립트를 시행시키면 자기 자신을 화면에 출력합니다.

# 주석문도 모두 출력되지요.

echo “This line is printed. “

(8)

스크립트 파일의 구성요소 - #

 주석 (comment)

 프로그램에 대한 설명

 행 전체, 또는 행의 일부를 주석으로 처리할 수 있음

 예 : test_sharp2

#!/bin/rm

# test_sharp2 : 자기 자신을 지우는 스크립트

# 이 스크립트를 실행시키면 이 파일이 지워집니다.

WHATEVER=65

print 이 부분은 절대로 출력되지 않을 겁니다.

exit $WHATEVER # exit 문도 실행되지 않지요.

(9)

스크립트 파일의 구성요소 - 쉘 명령

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

 여러 명령을 반복 수행해야 할 때 스크립트 파일로 저장하여 실행

 예 : find_script

#!/bin/bash

# find_script : /bin, /usr/bin에 있는 쉘 스크립트 검색

cd /bin

file * | grep “script”

cd /usr/bin

file * | grep “script”

ssh lily.mmu.ac.kr

$ ./find_script

2to3: executable /usr/bin/python2.6 script aalib-config: executable shell script

adrgen: executable /bin/ksh script

afmtodit: executable /usr/bin/perl script (중략)

xslt-config: executable shell script zipgrep: executable shell script

$

(10)

스크립트 파일의 구성요소 - 쉘 프로그램

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

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

 시스템이 사용하는 스크립트의 예 :

$ more /etc/rc2.d/S47pppd

#!/usr/sbin/sh

#

# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

#

PATH=/sbin:/usr/bin:/usr/sbin; export PATH PPPDIR=/etc/ppp; export PPPDIR

case "$1" in 'start')

--More--(10%)

시스템이 부팅될 때 실행되는 스크립트

(11)

02. 쉘 변수 사용하기

 변수 : 프로그램에서 처리하는 다양한 정보를 저장하는 곳

 종류

 쉘 변수(현재 쉘에서만 사용 가능), 환경변수(모든 쉘에서 사용가능)

 지정 방법

 변수명 = 값

 쉘 변수 표현식

형식 의미

$name name의 값으로 대체

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

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

${name:=word} name이 정의되지 않았았거나, 널 이라면 word를 대입하고 그 값 사용

${name:+word} name이 정의되어 있고, 그 값이 널이 아니면 word 값을 사용

name이 정의되어 있고 널문자가 아니면 그 값을 사용한다. 그렇지 않으면 word : 을 사용하지 않으면 널값을 갖고 있어도 변수가 정의된 것으로 간주

(12)

쉘 변수 사용하기 - 사용 예

ssh lily.mmu.ac.kr

$ test=cookbook

$ echo $test cookbook

$ echo ${test:-word}

cookbook

$ echo ${test1:-word}

word

$ echo ${test:=word}

cookbook

$ echo ${test1:=word}

word

$ echo ${test1:=word1}

word

$ echo ${test:+word}

word

$ echo ${test:?word}

cookbook

$ ^test^test2

echo ${test2:?word}

-bash: test2: word

$

1) test 변수에 “cookbook" 문자열 저장 2) test 변수값 출력

3) test 변수가 정의되어 있으므로 해당값 출력

4) tset1 변수가 없으므로 문자열 word 출

5) test 변수가 정의되어 있으므로 해당 값 출력

6) test1 변수가 없으므로 word를 그 값으 로 저장

7) tset1 변수가 6)에서 저장되어 있으므 로 그 값 출력

8) test 변수가 정의되어 있으므로 word 출력

9) test 변수가 정의되어 있으므로 해당 값 출력

10) tset2 변수가 없으므로 word 출력 후 스크립트 종료

(13)

쉘 변수 문자열 처리

 변수의 값이 문자열일 때 문자열 내 패턴을 찾아 일부분을 제거하는 표현식

 2.x 이전의 배시쉘에서는 동작하지 않음

표현식 기능

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

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

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

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

(14)

쉘 변수 문자열 처리 - %, #

 사용 예

 % : 뒤에서부터 패턴과 일치하는 최소 부분을 제거 (%%는 최대부분)

 # : 앞에서부터 패턴과 일치하는 최소 부분을 제거 (##은 최대부분)

ssh lily.mmu.ac.kr

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

$ echo ${path1%/bin}

/usr/bin/local

$ echo ${path1%%/bin*}

/usr

$

ssh lily.mmu.ac.kr

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

$ echo ${path2#/home}

/usr1/.profile

$ echo ${path2##*/}

.profile

$

%% 사용시 지정한 패턴이 변수값 중간에 있다면, 패턴 이후에 임의 의 값이 나올 수 있다는 표시로 * 지정해야 함!

## 을 사용할 때는 패턴 앞에 * 지정!!

이 예는 경로에서 파일명만 추출할 때 사용

(15)

쉘 변수 문자열 처리 - #변수

 사용 예

 #변수 : 변수에 저장된 문자의 개수 출력

ssh lily.mmu.ac.kr

$ echo ${#path1}

18

$ echo ${#path2}

20

$

(16)

명령행 인자 처리

 명령행 인자

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

 위치 매개 변수

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

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

명령행 인자 의미

$0 쉘 스크립트의 이름

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

$(10) 10번째 인자

$# 전체 인자 개수

$* 모든 인자

$@ $*과 같은 의미

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

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

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

(17)

명령행 인자 처리

 사용 예

#!/bin/bash

# test_position: 명령행 인자를 테스트

#

echo ‘$* : ‘ $*

echo '$# : ' $#

echo '$@ : ' $@

echo $1 $2 $3 set --

ssh lily.mmu.ac.kr

$ chmod +x test_position

$ ./test_position one twon three

$* : one two three

$# : 3

$@ : one two three one two three

$

(18)

쉘 특수문자 및 명령 처리

 인용부호 : 쉘 특수문자의 의미를 없애기 위해 사용

 명령 대체 : 명령 실행 결과를 문자열로 변환

인용 부호 기능 사용법

작은 따옴표 (‘ ‘) 모든 특수문자들이 해석되는 것을 막음 $echo ‘$test’

$test

큰 따옴표 (“ “) 변수나 명령의 대체만 허용 $echo “$test”

100

역슬래시 (\) 단일 문자가 해석되는 것을 막음 $echo \$test

$test

기호 사용법

백쿼터 (` `) $ echo `date`

Sunday, April 15, 2012 11:05:06 AM KST

$(명령) $ echo $(date)

Sunday, April 15, 2012 11:15:11 AM KST

(19)

사용자로부터 입력 받기 - read

 쉘 내장 명령으로 터미널이나 파일로부터 입력 처리

 사용 형식

형식 의미

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

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

read -p prompt prompt를 출력하고 입력을 기다린다. 입력된 값은 REPLY 변수에 저장

(20)

사용자로부터 입력 받기 - read

 사용 예 : test_read

#!/bin/bash

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

read x # 아무 메시지 없이 사용자 입력을 기다림 echo “x : $x” # 사용자가 임의의 값을 입력하면 출력

read x y # 첫 단어는 x, 나머지는 y에 저장 echo “x is $x y is $y” # x, y 값 출력

read -p “Input : “ # Input : 을 출력한 후 입력 기다림 echo “input : $REPLY” # $REPLY에 자동 저장된 입력값 출력

(21)

문서를 통한 입력 - here 문서

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

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

 키보드 입력의 종료 문자로 사용하는 EOF(^D) 문자를 파일 안에서 사용할 수 없기 때문에 입력 종료를 나타내는 문자열을 지정하여 사용

 예 : test_here

명령 << TERMINATOR 입력내용

TERMINATOR

#!/bin/bash

# here 문서 테스트. user1에게 메일을 보냄

mail user1 << END

This is a test mail for here document

(22)

04. 연산자

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

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

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

연산자 의미 사용예

- 음수 (단항연산) -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

(23)

연산자

 사용 예

ssh lily.mmu.ac.kr

$ a=5

$ echo $a

5 $ let a = 20 ----> let에서 공백을 사용 못함

-bash: let: =: syntax error: operand expected (error token is "=")

$ let “a = 20” ----> 공백을 포함하려면 " " 사용해야 함

$ print $a

20 $ (( a = 30 )) ----> (( ))에서는 공백 사용 가능

$ echo $a

30 $ a=$a*5 ----> let이나 (( ))을 사용하지 않으면 문자열로 처리

$ echo $a 30*5

$ echo $((5*6)) ----> 계산 결과를 바로 출력할 수 있음

30 $ echo $(( ! 2 + 3 * 4 )) ----> 우선순위에 따라 ! 먼저 수행. 2는 0이 됨.

12 $ echo $(( 2 << 1 )) ----> 왼쪽 shift는 *2와 같음. 2번 shift는 *4 4 $ echo $(( 3 ^ 5 )) ----> XOR 연산 결과

(24)

05. 제어문

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

 선택적 실행문

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

 if , select

 반복 실행문

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

 while , do , for

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

조건 문장 1

문장 2

No(False) Yes(True) 문장 1

문장 2

조건 문장 1

문장 2

No(False) Yes(True)

(25)

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

 주어진 조건의 참, 거짓여부에 따라 명령 실행

 예 : test_if

if 조건명령 then

명령 [ else 명령 ] fi

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

0이면 else 다음의 명령을 실행한다.

#!/bin/bash

# test_if : if 문을 테스트하는 스크립트

print -n “Input x : “

read x # x 값을 입력 받음 print -n “Input y : “

read y # y 값을 입력 받음 if (( x < y ))

then

echo “x is less than y“

else

echo “y is less than x“

ssh lily.mmu.ac.kr

$ ./test_if Input x : 100 Input y : 200 x is less then y

$

(26)

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

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

 예 : test_elif

if 조건명령1 then

명령

elif 조건명령2 then

명령 else 명령 fi

#!/bin/bash

# test_elif: if-elif 문 테스트

print -n “Input Score : “ read score

if (( $score > 90 )) then

echo “Your score is great. “ elif (( $score >= 80 ))

then

echo “Your score is good. “ else

echo “Your score is not good. “ fi

ssh lily.mmu.ac.kr

$ ./test_elif Input Score : 50

Your score is not good.

$

(27)

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

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

 내장 명령 [[ ]] 사용

문자열연산자 동작

string = pattern

string == pattern string 이 pattern과 일치. = 연산자 양쪽에 공백 string != pattern string 이 pattern과 일치하지 않음

string string 이 널이 아님 -z string string 의 길이가 0

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

-l string string 의 길이

(28)

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

 예 : test_string

#!/bin/bash

# test_string: 문자열 테스트 스크립트 print -n "Are you OK (y/n) ? "

read ans # ans 변수에 값 저장

if [[ $ans = [Yy]* ]] # y로 시작하는 문자열인가 then

print Happy to hear it. # y로 시작하면 else

print That is too bad. # y로 시작하지 않으면

fi

(29)

조건 테스트 - test 플래그

 파일 관련 테스트

test 플래그 기능

-a file 파일이 존재 -e file 파일이 존재

-L file 심볼릭 링크 파일

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

-G file 파일의 그룹 ID가 스크립트의 그룹 ID와 같음

-S file 소켓 파일

(30)

조건 테스트 - test 플래그

test 플래그 기능

-r file 읽기 가능 -w file 쓰기 가능

-x file 실행 가능

-b file 블록 장치 특수 파일 -c file 문자 장치 특수 파일 -d file 디렉토리 파일

-p file 파이프 파일

-u file setuid 권한 부여 파일 -g file setgid 권한 부여 파일

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

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

(31)

조건 테스트 - test 플래그

 예 : test_file

#!/bin/bash

# test_file: 파일 연산자 테스트 print -n "파일 이름을 입력하세요 : "

read file if [[ -G $file ]]

then

print 그룹ID가 같습니다.

else

print 그룹ID가 같지 않습니다.

fi

if [[ ! -a $file ]]

then

print 파일이 존재하지 않습니다. 파일 이름을 다시 확인하세요.

elif [[ -f $file ]]

then

print 일반 파일입니다.

elif [[ -d $file ]]

then

print 디렉토리 파일 입니다.

else

ssh lily.mmu.ac.kr

$ ./test_file

파일 이름을 입력하세요 : /dev/null 그룹ID가 같지 않습니다.

특수파일입니다

$ ./test_file

파일 이름을 입력하세요 : . 그룹ID가 같습니다.

디렉토리 파일입니다.

$ ./test_file

파일 이름을 입력하세요 : /etc/hosts 그룹ID가 같지 않습니다.

일반 파일입니다.

$

(32)

선택적 실행문 - case 문

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

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

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

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

case 변수 in value1)

명령 ;;

value2) 명령 ;;

*)

명령 ;;

esac

(33)

선택적 실행문 - case 문

 예 : test_case

#!/bin/bash

# case 테스트 스크립트 print -n 명령을 선택하세요 : read cmd

case $cmd in

[0-9]) # 0부터 9까지 임의의 숫자 date

;;

"cd" | "CD") # cd 또는 CD print $HOME

;;

[aA-C]*) # 소문자 a, 대문자 A,B,C로 시작하는 임의의 문자열 pwd

;;

*) print Usage : 명령을 선택하세요 ;;

ssh lily.mmu.ac.kr

$ ./test_case

명령을 선택하세요 : 5

Sunday, August 19, 2012 12:31:

35 AM KST

$ ./test_case

명령을 선택하세요 :cd /home/user1

$ ./test_case

명령을 선택하세요 :a /home/user1/Unix/ch13

$

(34)

반복 실행문 - for

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

 예 : test_for

for 변수 in list do

명령 done

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

#!/bin/bash

# test_for: for 테스트 스크립트

for num in 0 1 2

do

print number is $num

done

ssh lily.mmu.ac.kr

$ test_for number is 0 number is 1 number is 2

$

(35)

반복 실행문 - for

 명령행 인자 처리 가능

 예 : test_for3

#!/bin/ ba sh

# test_for3: 명령행 인자 처리 for person in $*

do

mailx $person < letter

print ${person}에게 메일을 보냈습니다.

done

print --- print 모든 메일을 보냈습니다.

ssh lily.mmu.ac.kr

$ ./test_for3 user1 user2 user3 user1에게 메일을 보냈습니다.

user2에게 메일을 보냈습니다.

user3에게 메일을 보냈습니다.

--- 모든 메일을 보냈습니다.

$

(36)

반복 실행문 - while

 조건 명령이 정상 실행되는 동안 명령 반복

 예 : test_while

while 조건명령 do

명령

done

#!/bin/bash

# test_while: while을 이용해 1부터 10까지 합을 구하는 스크립트

count=1 sum=0

while (( count <= 10 )) do (( sum += count )) let count+=1 done

print 1부터 10까지의 합 : $sum

ssh lily.mmu.ac.kr

$ test _while

1부터 10까지의 합 : 55

$

(37)

반복 실행문 - until

 조건 명령이 정상 실행될 때까지 명령 반복

 예 : test_until

until 조건명령 do

명령

done

#!/bin/bash

# test_until: 지정한 사용자가 로그인하면 알리는 스크립트 print -n “로그인 이름: " # 입력 안내문 출력

read person # 유저 이름을 person에 저장 until who | grep $person # > /dev/null

do sleep 5 # 유저가 접속 중이 아니면 5초 쉼 done

print "\007" # beep. 삑 소리를 냄

ssh lily.mmu.ac.kr

$ ./test_until

로그인 이름 : hanb

hanb pts/3 Aug 19 01:07 (192.168.0.2)

$

(38)

반복 실행문 - select

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

 list에 지정한 항목을 자동으로 선택 가능한 메뉴로 만들어 화면에 출력해줌

 사용자는 각 항목에 자동 부여된 번호를 선택

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

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

select 변수 in list do

명령 done

자동 메뉴 생성 목록 사용자 입력값

저장

일반적으로 case 문 사용

(39)

반복 실행문 - select

 예 : test_select

#!/bin/bash

# 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

ssh lily.mmu.ac.kr

$ test _select 1) pwd

2) date 3) quit

명령을 입력하세요 : 1

/export/home/user1/unix/ch13 1) pwd

2) date 3) quit

명령을 입력하세요 : 3

$

(40)

루프 제어문 - continue

 루프 안에서 사용

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

 숫자를 지정하면 중첩된 루프 안에서 특정 루프의 처음으로 돌아갈 수 있음

 예 : test_cont

#!/bin/# test_cont: continue 테스트 bash

for person in $(< list) # `cat list`와 동일 do if [[ $person == user2 ]] then

continue # user2 이면 건너뜀 fi

mailx -s “continue test” $person < letter print ${person}에게 메일을 보냈습니다.

done

print --- print 모든 메일을 보냈습니다.

(41)

06. 함수

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

 앨리어스와의 차이점

 조건에 따라 처리 가능

 인자 처리 가능

 예 : trash

function 함수이름 {

명령들 }

ssh lily.mmu.ac.kr

$ mkdir ~/.TRASH

$ function trash {

> mv $* ~/.TRASH

> }

$

(42)

함수 확인 및 호출

 정의된 함수 확인  함수 호출

ssh lily.mmu.ac.kr

$ typeset -f trash()

{

mv $* ~/.TRASH }

$

ssh lily.mmu.ac.kr

$ touch a b c

$ ls

a b c

$ trash a b c

$ ls

$ ls ~/.TRASH a b c

$

(43)

함수의 종료 - return

 함수 종료 조건

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

 return 문 실행

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

return [ n ]

(44)

함수의 종료 - return

 예 : test_add

#!/bin/bash

# 함수 리턴값 테스트 function sum {

typeset sum

(( sum= $1 + $2 )) return $sum

}

sum $1 $2

print $1 + $2 = $?

ssh lily.mmu.ac.kr

$ add 3 4 3 + 4 = 7

$

(45)

함수 삭제 - unset

 정의된 함수를 삭제

 사용 예

unset -f 함수명

ssh lily.mmu.ac.kr

$ unset -f trash

$ functions

$

(46)

07. 디버깅

 스크립트 실행도중 발생한 오류 수정 방법

 구문 오류

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

 실행 오류

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

 오류 수정 방법

 bash -x, trap

(47)

디버깅 : bash -x

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

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

ssh lily.mmu.ac.kr

$ bash -x test_while + 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

스크립트의 내용

(48)

디버깅 : trap

 지정한 시그널이 스크립트로 전달될 때마다 지정한 명령 실행

 스크립트의 명령이 한 줄씩 실행될 때마다 DEBUG 시그널이 스크립트로 전달됨

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

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

trap 명령 시그널

(49)

디버깅 : trap

 예 : test_trap

#!/bin/bash

# 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

ssh lily.mmu.ac.kr

$ ./test_trap 6 : count=

7 : count=1 9 : count=1 11 : count=2 12 : count=2 (중략)

9 : count=11 15 : count=11

1부터 10까지의 합 : 55

$

(50)

13장 요약 [1/3]

 쉘 스크립트 개요

 쉘이 제공하는 프로그래밍 구문과 유닉스 명령으로 구성된 텍스트 파일

 실행방법 : $ bash script 또는 $chmod +x script $ script

 쉘 변수 사용하기

 변수 정의 : 변수명=값

 다양한 변수 표현 방법, 변수 문자열 처리 방법이 있음

 명령행 인자는 위치 매개 변수를 이용하여 처리 ($0, $1, ..)

 사용자 입력 처리

 키보드 입력 처리 : read

 스크립트에서 입력 처리 : here 문서

 연산자

 산술, 비교, 논리, 비트 연산지 제공

 사용방법: let 다음 또는 (( )) 안에 연산식 기술

(51)

13장 요약 [2/3]

 조건문

if 문 : if 다음의 명령을 실행한 종료 값이 0이면 then 다음을, 0이 아닌 값이면 else 다음을 실행

case 문 : 변수의 값에 따라 선택적으로 명령 실행

 반복문

for 문 : 리스트에 있는 값을 순차적으로 변수에 저장하여 명령 실행

while 문 : 조건 명령이 성공인 동안 명령 반복 실행

until 문 : 조건 명령이 실패인 동안 명령 반복 실행

select 문 : 선택 가능한 메뉴를 생성하는 반복문. 선택에 따른 동작을 지정하려면 case 문과 함께 사용해야

 함수

하나의 이름으로 실행할 수 있는 명령의 집합으로 인자전달 가능

함수 정의 : $ function foo { date; cal; }

함수 호출 : $ foo

함수 삭제 : $ unset -f foo

(52)

13장 요약 [3/3]

 디버깅

 스크립트의 실행 오류 수정 방법

 bash -x script : 지정한 script를 한 행씩 실행하며 결과를 화면에 출력

 trap ‘명령’ DEBUG : trap 을 포함한 스크립트를 한 행씩 실행할 때마다 trap 안에 기술한

명령을 실행

참조

관련 문서

Ø mass per unit length is constant; string is perfectly elastic and no resistance to bending.. Ø tension in string is sufficiently large so that gravitational forces may

우리나라는 태풍 및 장마와 관련된 중규모 악기상에 의한 피해액이 전체 자연재해 의 90%를 상회하고 있으며 이에 따른 인명 및 재산의 피해가 증가 추세에 있다.이

생각열기 신기한 과학 마술 알아보기 생각펼치기 오목렌즈와 볼록렌즈의 비밀.. 생각다지기 찰칵

생각열기 신기한 과학 마술 알아보기 생각펼치기 오목렌즈와 볼록렌즈의 비밀.. 생각다지기 찰칵

hasSensorType String 차량 센서 Type을 표현. hasState String 클래스

indicated input stream fgets( char *s, int n, FILE *) Address of the string/NULL pointer. fputs() Writes the character string pointed to

indicated input stream fgets( char *s, int n, FILE *) Address of the string/NULL pointer. fputs() Writes the character string pointed to

(Key words) 반발계수, string tension, shaft의 stiffness, 상대속도, swing speed.. 이 경기에 대비하여 배드민턴에 대해 여러 가지로 알아보던 중, 배드민턴