13장. 배시 쉘 프로그래밍
UNIX 및 실습
학습목표
다양한 쉘 변수를 이해하고 활용하는 방법을 익힌다
사용자로부터 입력을 받아 스크립트 파일에서 처리하는 방법을 익힌다
다양한 연산자와 문자열 테스트, 파일 테스트를 활용하는 방법을 익힌다
조건문과 반복문의 사용 방법을 익힌다
함수를 이용해 스크립트를 작성하는 방법을 익힌다
스크립트의 실행 오류를 찾아 수정하는 방법을 익힌다
01. 쉘 스크립트
스크립트?
인터프리터라 불리는 다른 프로그램에 의해 실행되는 프로그램
자바 스크립트, Perl, 파이썬,…
쉘 스크립트
쉘이 실행하는 프로그램
유닉스 명령 + 쉘이 제공하는 프로그램 구성 요소
쉘 스크립트 파일 이름은 키워드나 앨리어스 ,내장 명령과 같은 이름을 쓰지 않는 것이 바람직함
쉘 명령 실행 순서 : 앨리어스 → 키워드(if, while, until 등) → 함수 → 내장 명령(cd, echo 등) → 스크립트, 유틸리트 등 PATH 경로에 있는 실행
가능한 파일
쉘 스크립트 만들기
vi 에디터로 편집
예 : test_script
#!/bin/bash
# My First Script Program print I love UNIX !
pwd
쉘 스크립트 실행하기
스크립트 실행방법
쉘을 실행하면서 인자로 스크립트 이름 지정
파일을 직접 실행
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 환경 변수에 현재 디렉토리 (.)가 포함되어 있지 않으면 ./를
꼭 지정해야 함!!
쉘 스크립트 종료하기 - exit
스크립트의 종료
종료 상태를 $? 변수에 저장
사용 예 : test_exit
exit [ 종료상태 ]
스크립트가 종료되는 경우?
파일의 마지막 명령을 실행 exit 문 실행
#!/bin/bash
#test_exit : exit과 $? 를 테스트하는 프로그램
exit 20 텔넷 cookook.co.kr
$ test_exit
$ echo $?
20
$
스크립트 파일의 구성요소 - #!
매직 넘버
파일의 가장 처음에 위치
스크립트를 실행할 프로그램 지정
각 쉘마다 제공하는 스크립트 언어의 문법이 조금씩 다르므로, 이 스크립트를 실행할 쉘을 지정해 주어야 올바로 실행됨
쉘이 아닌, 다른 실행 가능한 명령을 지정해 주어도 됨
예 : test_sharp
#!/bin/more
# test_sharp: 스스로를 출력하는 스크립트
# 이 스크립트를 시행시키면 자기 자신을 화면에 출력합니다.
# 주석문도 모두 출력되지요.
echo “This line is printed. “
스크립트 파일의 구성요소 - #
주석 (comment)
프로그램에 대한 설명
행 전체, 또는 행의 일부를 주석으로 처리할 수 있음
예 : test_sharp2
#!/bin/rm
# test_sharp2 : 자기 자신을 지우는 스크립트
# 이 스크립트를 실행시키면 이 파일이 지워집니다.
WHATEVER=65
print 이 부분은 절대로 출력되지 않을 겁니다.
exit $WHATEVER # exit 문도 실행되지 않지요.
스크립트 파일의 구성요소 - 쉘 명령
쉘이 실행할 수 있는 모든 명령어 사용 가능
여러 명령을 반복 수행해야 할 때 스크립트 파일로 저장하여 실행
예 : 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
$
스크립트 파일의 구성요소 - 쉘 프로그램
각 쉘이 제공하는 프로그램을 위한 구문
쉘 변수, 인자처리, 각종 연산자, 제어문 등 포함
시스템이 사용하는 스크립트의 예 :
$ 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%)
시스템이 부팅될 때 실행되는 스크립트
02. 쉘 변수 사용하기
변수 : 프로그램에서 처리하는 다양한 정보를 저장하는 곳
종류
쉘 변수(현재 쉘에서만 사용 가능), 환경변수(모든 쉘에서 사용가능)
지정 방법
변수명 = 값
쉘 변수 표현식
형식 의미
$name name의 값으로 대체
$(name) name의 값으로 대치. 변수 이름이 다른 구문과 인접해 있을 때 사용
${name:-word} name이 정의되어 있으면 그 값을, 그렇지 않으면 word값 사용
${name:=word} name이 정의되지 않았았거나, 널 이라면 word를 대입하고 그 값 사용
${name:+word} name이 정의되어 있고, 그 값이 널이 아니면 word 값을 사용
name이 정의되어 있고 널문자가 아니면 그 값을 사용한다. 그렇지 않으면 word : 을 사용하지 않으면 널값을 갖고 있어도 변수가 정의된 것으로 간주
쉘 변수 사용하기 - 사용 예
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 출력 후 스크립트 종료
쉘 변수 문자열 처리
변수의 값이 문자열일 때 문자열 내 패턴을 찾아 일부분을 제거하는 표현식
2.x 이전의 배시쉘에서는 동작하지 않음
표현식 기능
${vairable%pattern} variable의 뒤부터 패턴과 일치하는 첫 번째 부분을 찾아서 제거
${variable%%pattern} variable 값의 뒤부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거
${variable#pattern} variable 값의 앞부터 패턴과 일치하는 첫 번째 부분을 찾아서 제거
${variable##pattern} variable 값의 앞부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거
쉘 변수 문자열 처리 - %, #
사용 예
% : 뒤에서부터 패턴과 일치하는 최소 부분을 제거 (%%는 최대부분)
# : 앞에서부터 패턴과 일치하는 최소 부분을 제거 (##은 최대부분)
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
$
%% 사용시 지정한 패턴이 변수값 중간에 있다면, 패턴 이후에 임의 의 값이 나올 수 있다는 표시로 * 지정해야 함!
## 을 사용할 때는 패턴 앞에 * 지정!!
이 예는 경로에서 파일명만 추출할 때 사용
쉘 변수 문자열 처리 - #변수
사용 예
#변수 : 변수에 저장된 문자의 개수 출력
ssh lily.mmu.ac.kr
$ echo ${#path1}
18
$ echo ${#path2}
20
$
명령행 인자 처리
명령행 인자
스크립트를 실행할 때 인자로 주어진 값
위치 매개 변수
명령행 인자를 저장하는 스크립트 변수
인자의 위치에 따라 이름이 정해짐
명령행 인자 의미
$0 쉘 스크립트의 이름
$1 - $9 명령행에 주어진 첫번째부터 9번째까지 인자
$(10) 10번째 인자
$# 전체 인자 개수
$* 모든 인자
$@ $*과 같은 의미
“$*” “$1 $2 $3”
“$@" “$1” “$2” “$3”
$? 최근 실행된 명령의 종료값
명령행 인자 처리
사용 예
#!/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
$
쉘 특수문자 및 명령 처리
인용부호 : 쉘 특수문자의 의미를 없애기 위해 사용
명령 대체 : 명령 실행 결과를 문자열로 변환
인용 부호 기능 사용법
작은 따옴표 (‘ ‘) 모든 특수문자들이 해석되는 것을 막음 $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
사용자로부터 입력 받기 - read
쉘 내장 명령으로 터미널이나 파일로부터 입력 처리
사용 형식
형식 의미
read x 표준입력에서 한 행을 입력 받아 x에 저장
read first last 표준입력에서 한 행을 입력 받아 첫 번째 단어를 first에 저장하고 나머지 모두를 last에 저장
read -p prompt prompt를 출력하고 입력을 기다린다. 입력된 값은 REPLY 변수에 저장
사용자로부터 입력 받기 - 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에 자동 저장된 입력값 출력
문서를 통한 입력 - here 문서
표준 입력을 사용자로부터 직접 받아들이지 않고 자동 처리
TERMINATOR가 입력될 때까지 기술된 부분을 키보드 입력으로 처리
키보드 입력의 종료 문자로 사용하는 EOF(^D) 문자를 파일 안에서 사용할 수 없기 때문에 입력 종료를 나타내는 문자열을 지정하여 사용
예 : test_here
명령 << TERMINATOR 입력내용
TERMINATOR
#!/bin/bash
# here 문서 테스트. user1에게 메일을 보냄
mail user1 << END
This is a test mail for here document
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
연산자
사용 예
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 연산 결과
05. 제어문
프로그램내의 문장 실행 순서를 제어하는 것
선택적 실행문
프로그램 실행문을 조건에 따라 선택적으로 실행
if , select
반복 실행문
프로그램 실행문을 정해진 횟수나 조건에 따라 반복 실행
while , do , for
순차적 수행 선택적 수행 반복 수행
조건 문장 1
문장 2
No(False) Yes(True) 문장 1
문장 2
조건 문장 1
문장 2
No(False) Yes(True)
선택적 실행문 - 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
$
선택적 실행문 - 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.
$
조건 테스트 - 문자열 연산자
조건 명령에 사용하는 문자열 연산자
내장 명령 [[ ]] 사용
문자열연산자 동작
string = pattern
string == pattern string 이 pattern과 일치. = 연산자 양쪽에 공백 string != pattern string 이 pattern과 일치하지 않음
string string 이 널이 아님 -z string string 의 길이가 0
-n string string 의 길이가 0이 아님
-l string string 의 길이
조건 테스트 - 문자열 연산자
예 : 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
조건 테스트 - test 플래그
파일 관련 테스트
test 플래그 기능
-a file 파일이 존재 -e file 파일이 존재
-L file 심볼릭 링크 파일
-O file 사용자가 file의 소유자
-G file 파일의 그룹 ID가 스크립트의 그룹 ID와 같음
-S file 소켓 파일
조건 테스트 - 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이 아님
조건 테스트 - 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가 같지 않습니다.
일반 파일입니다.
$
선택적 실행문 - case 문
주어진 변수의 값에 따라 실행할 명령 따로 지정
변수의 값이 value1 이면 value1부터 ;;을 만날 때까지 명령 실행
값의 지정에 특수기호, | (or 연산자) 사용 가능
일치하는 값이 없으면 기본값인 * 부터 실행
case 변수 in value1)
명령 ;;
value2) 명령 ;;
*)
명령 ;;
esac
선택적 실행문 - 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
$
반복 실행문 - 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 $numdone
ssh lily.mmu.ac.kr
$ test_for number is 0 number is 1 number is 2
$
반복 실행문 - 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에게 메일을 보냈습니다.
--- 모든 메일을 보냈습니다.
$
반복 실행문 - 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
$
반복 실행문 - 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)
$
반복 실행문 - select
메뉴를 생성할 수 있는 반복 실행문
list에 지정한 항목을 자동으로 선택 가능한 메뉴로 만들어 화면에 출력해줌
사용자는 각 항목에 자동 부여된 번호를 선택
사용자 입력은 select와 in 사이에 지정된 변수에 저장
보통 case 문과 결합하여 입력 값 처리
select 변수 in list do
명령 done
자동 메뉴 생성 목록 사용자 입력값
저장
일반적으로 case 문 사용
반복 실행문 - 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
$
루프 제어문 - continue
루프 안에서 사용
이후 실행 순서를 무시하고 루프의 처음으로 돌아가는 명령
숫자를 지정하면 중첩된 루프 안에서 특정 루프의 처음으로 돌아갈 수 있음
예 : test_cont
#!/bin/# test_cont: continue 테스트 bashfor person in $(< list) # `cat list`와 동일 do if [[ $person == user2 ]] then
continue # user2 이면 건너뜀 fi
mailx -s “continue test” $person < letter print ${person}에게 메일을 보냈습니다.
done
print --- print 모든 메일을 보냈습니다.
06. 함수
함수 : 하나의 목적으로 사용되는 명령들의 집합
앨리어스와의 차이점
조건에 따라 처리 가능
인자 처리 가능
예 : trash
function 함수이름 {
명령들 }
ssh lily.mmu.ac.kr
$ mkdir ~/.TRASH
$ function trash {
> mv $* ~/.TRASH
> }
$
함수 확인 및 호출
정의된 함수 확인 함수 호출
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
$
함수의 종료 - return
함수 종료 조건
함수 본문 안의 마지막 문장 실행
return 문 실행
지정한 값이 함수의 종료값으로 $?에 저장됨
return [ n ]
함수의 종료 - 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
$
함수 삭제 - unset
정의된 함수를 삭제
사용 예
unset -f 함수명
ssh lily.mmu.ac.kr
$ unset -f trash
$ functions
$
07. 디버깅
스크립트 실행도중 발생한 오류 수정 방법
구문 오류
쉘이 실행도중 구문오류가 발생한 라인번호 출력
실행 오류
오류 메시지 없이 실행이 안되거나 비정상 종료
오류 수정 방법
bash -x, trap
디버깅 : 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
스크립트의 내용
디버깅 : trap
지정한 시그널이 스크립트로 전달될 때마다 지정한 명령 실행
스크립트의 명령이 한 줄씩 실행될 때마다 DEBUG 시그널이 스크립트로 전달됨
DEBUG 시그널을 받을 때마다 원하는 변수값 출력 가능
스크립트가 실행되는 도중 변수값 확인
trap 명령 시그널
디버깅 : 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
$
13장 요약 [1/3]
쉘 스크립트 개요
쉘이 제공하는 프로그래밍 구문과 유닉스 명령으로 구성된 텍스트 파일
실행방법 : $ bash script 또는 $chmod +x script $ script
쉘 변수 사용하기
변수 정의 : 변수명=값
다양한 변수 표현 방법, 변수 문자열 처리 방법이 있음
명령행 인자는 위치 매개 변수를 이용하여 처리 ($0, $1, ..)
사용자 입력 처리
키보드 입력 처리 : read
스크립트에서 입력 처리 : here 문서
연산자
산술, 비교, 논리, 비트 연산지 제공
사용방법: let 다음 또는 (( )) 안에 연산식 기술
13장 요약 [2/3]
조건문
if 문 : if 다음의 명령을 실행한 종료 값이 0이면 then 다음을, 0이 아닌 값이면 else 다음을 실행
case 문 : 변수의 값에 따라 선택적으로 명령 실행
반복문
for 문 : 리스트에 있는 값을 순차적으로 변수에 저장하여 명령 실행
while 문 : 조건 명령이 성공인 동안 명령 반복 실행
until 문 : 조건 명령이 실패인 동안 명령 반복 실행
select 문 : 선택 가능한 메뉴를 생성하는 반복문. 선택에 따른 동작을 지정하려면 case 문과 함께 사용해야
함수
하나의 이름으로 실행할 수 있는 명령의 집합으로 인자전달 가능
함수 정의 : $ function foo { date; cal; }
함수 호출 : $ foo
함수 삭제 : $ unset -f foo