13장. 배시쉘 프로그래밍
Contents 학습목표 내용 다양한 쉘 변수를 이해하고 활용하는 방법을 익힌다 사용자로부터 입력을 받아 스크립트 파일에서 처리하는 방법을 익힌다 다양한 연산자와 문자열 테스트, 파일 테스트를 활용하는 방법을 익힌다 조건문과 반복문의 사용 방법을 익힌다 함수를 이용해 스크립트를 작성하는 방법을 익힌다 스크립트의 실행 오류를 찾아 수정하는 방법을 익힌다 내용 쉘 스크립트 쉘 변수 사용하기 사용자로부터 입력받기 연산자 제어문 함수 디버깅
01. 쉘 스크립트 스크립트? 쉘 스크립트 인터프리터라 불리는 다른 프로그램에 의해 실행되는 프로그램 자바 스크립트, Perl, 파이썬,… 쉘 스크립트 쉘이 실행하는 프로그램 유닉스 명령 + 쉘이 제공하는 프로그램 구성 요소 쉘 스크립트 파일 이름은 키워드나 앨리어스 ,내장 명령과 같은 이름을 쓰지 않는 것이 바람직 함 쉘 명령 실행 순서 : 앨리어스 → 키워드(if, while, until 등) → 함수 → 내장 명령(cd, echo 등) → 스크립트, 유틸리트 등 PATH 경로에 있는 실행가능한 파일
쉘 스크립트 만들기 vi 에디터로 편집 예 : test_script #!/bin/bash # My First Script Program print I love UNIX ! pwd
PATH 환경 변수에 현재 디렉토리 (.)가 포함되어 있지 않으면 ./를 꼭 지정해야 함!! 쉘 스크립트 실행하기 스크립트 실행방법 쉘을 실행하면서 인자로 스크립트 이름 지정 파일을 직접 실행 텔넷 cookook.co.kr $ bash test_script I love UNIX! /home/user1/unix/ch13 $ 텔넷 cookook.co.kr $ chmod +x test_script $ ./test_script I love UNIX! /home/user1/unix/ch13 $ PATH 환경 변수에 현재 디렉토리 (.)가 포함되어 있지 않으면 ./를 꼭 지정해야 함!!
쉘 스크립트 종료하기 - exit 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” 텔넷 cookook.co.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} name이 정의되어 있고 널문자가 아니면 그 값을 사용한다. 그렇지 않으면 word 출력 후 종료
쉘 변수 사용하기 - 사용 예 $ test=cookbook test 변수에 “cookbook" 문자열 저장 텔넷 cookook.co.kr $ test=cookbook $ echo $test cookbook $ echo ${test:-word} $ echo ${test1:-word} word $ echo ${test:=word} $ echo ${test1:=word} $ echo ${test1:=word1} $ echo ${test:+word} $ echo ${test:?word} $ ^test^test2 echo ${test2:?word} -bash: test2: word $ test 변수에 “cookbook" 문자열 저장 test 변수값 출력 test 변수가 정의되어 있으므로 해당값 출력 tset1 변수가 없으므로 문자열 word 출력 test 변수가 정의되어 있으므로 해당 값 출력 test1 변수가 없으므로 word를 그 값으로 저장 tset1 변수가 6)에서 저장되어 있으므로 그 값 출력 test 변수가 정의되어 있으므로 word 출력 tset2 변수가 없으므로 word 출력 후 스크립트 종료
쉘 변수 문자열 처리 변수의 값이 문자열일 때 문자열 내 패턴을 찾아 일부분을 제거하는 표현식 2.x 이전의 배시쉘에서는 동작하지 않음 표현식 기능 ${vairable%pattern} variable의 뒤부터 패턴과 일치하는 첫번째 부분을 찾아서 제거 ${variable%%pattern} variable 값의 뒤부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거 ${variable#pattern} variable 값의 앞부터 패턴과 일치하는 첫번째 부분을 찾아서 제거 ${variable##pattern} variable 값의 앞부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거
%% 사용시 지정한 패턴이 변수값 중간에 있다면, 패턴 이후에 임의의 값이 나올 수 있다는 표시로 * 지정해야 함! 쉘 변수 문자열 처리 - %, # 사용 예 % : 뒤에서부터 패턴과 일치하는 최소 부분을 제거 (%%는 최대부분) # : 앞에서부터 패턴과 일치하는 최소 부분을 제거 (##은 최대부분) 텔넷 cookook.co.kr $ path1="/usr/bin/local/bin" $ echo ${path1%/bin} /usr/bin/local $ echo ${path1%%/bin*} /usr $ %% 사용시 지정한 패턴이 변수값 중간에 있다면, 패턴 이후에 임의의 값이 나올 수 있다는 표시로 * 지정해야 함! 텔넷 cookook.co.kr $ path2=“/home/user1/.profile" $ echo ${path2#/home} /usr1/.profile $ echo ${path2##*/} .profile $ ## 을 사용할 때는 패턴 앞에 * 지정!! 이 예는 경로에서 파일명만 추출할 때 사용
쉘 변수 문자열 처리 - #변수 사용 예 #변수 : 변수에 저장된 문자의 개수 출력 $ echo ${#path1} 18 텔넷 cookook.co.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 -- 텔넷 cookook.co.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 기호 사용법 백쿼터 (` `) $ 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 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에 자동 저장된 입력값 출력
명령 << TERMINATOR 문서를 통한 입력 - here 문서 표준 입력을 사용자로부터 직접 받아들이지 않고 자동 처리 TERMINATOR가 입력될 때까지 기술된 부분을 키보드 입력으로 처리 키보드 입력의 종료 문자로 사용하는 EOF(^D) 문자를 파일 안에서 사용할 수 없기 때문에 입력 종료를 나타내는 문자열을 지정하여 사용 예 : test_here 명령 << TERMINATOR 입력내용 TERMINATOR #!/bin/bash # here 문서 테스트. user1에게 메일을 보냄 mail user1 << END This is a test mail for here document END
<= >= < > == != 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
연산자 사용 예 $ a=5 $ echo $a 5 $ let a = 20 ----> let에서 공백을 사용 못함 텔넷 cookook.co.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 )) ----> (( ))에서는 공백 사용 가능 30 $ a=$a*5 ----> let이나 (( ))을 사용하지 않으면 문자열로 처리 30*5 $ echo $((5*6)) ----> 계산 결과를 바로 출력할 수 있음 $ echo $(( ! 2 + 3 * 4 )) ----> 우선순위에 따라 ! 먼저 수행. 2는 0이 됨. 12 $ echo $(( 2 << 1 )) ----> 왼쪽 shift는 *2와 같음. 2번 shift는 *4 4 $ echo $(( 3 ^ 5 )) ----> XOR 연산 결과 6 $
05. 제어문 프로그램내의 문장 실행 순서를 제어하는 것 선택적 실행문 반복 실행문 프로그램 실행문을 조건에 따라 선택적으로 실행 if , select 반복 실행문 프로그램 실행문을 정해진 횟수나 조건에 따라 반복 실행 while , do , for 순차적 수행 선택적 수행 반복 수행 문장 1 문장 2 조건 No(False) 문장 1 Yes(True) 조건 Yes(True) 문장 1 문장 2 No(False) 문장 2
선택적 실행문 - if~then~else 주어진 조건의 참, 거짓여부에 따라 명령 실행 예 : test_if if 조건명령 엄밀히 말하면 조건 명령을 실행하여 그 실행값이 0이 아닌 값이면 then다음의 명령을 실행하고, 0이면 else 다음의 명령을 실행한다. if 조건명령 then 명령 [ else 명령 ] fi #!/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“ fi 텔넷 cookook.co.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 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 )) echo “Your score is good. “ else echo “Your score is not good. “ fi 텔넷 cookook.co.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 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 $ ./test_file 파일 이름을 입력하세요 : /dev/null 텔넷 cookook.co.kr $ ./test_file 파일 이름을 입력하세요 : /dev/null 그룹ID가 같지 않습니다. 특수파일입니다 파일 이름을 입력하세요 : . 그룹ID가 같습니다. 디렉토리 파일입니다. 파일 이름을 입력하세요 : /etc/hosts 일반 파일입니다. $ #!/bin/bash # test_file: 파일 연산자 테스트 print -n "파일 이름을 입력하세요 : " read file if [[ -G $file ]] then print 그룹ID가 같습니다. else print 그룹ID가 같지 않습니다. fi if [[ ! -a $file ]] print 파일이 존재하지 않습니다. 파일 이름을 다시 확인하세요. elif [[ -f $file ]] print 일반 파일입니다. elif [[ -d $file ]] print 디렉토리 파일 입니다. print 특수 파일입니다.
선택적 실행문 - case 문 주어진 변수의 값에 따라 실행할 명령 따로 지정 변수의 값이 value1 이면 value1부터 ;;을 만날 때까지 명령 실행 값의 지정에 특수기호, | (or 연산자) 사용 가능 일치하는 값이 없으면 기본값인 * 부터 실행 case 변수 in value1) 명령 ;; value2) *) esac
선택적 실행문 - case 문 예 : test_case $ ./test_case 명령을 선택하세요 : 5 #!/bin/bash 텔넷 cookook.co.kr $ ./test_case 명령을 선택하세요 : 5 Sunday, August 19, 2012 12:31: 35 AM KST 명령을 선택하세요 :cd /home/user1 명령을 선택하세요 :a /home/user1/Unix/ch13 $ #!/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 : 명령을 선택하세요 esac
반복 실행문 - 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 텔넷 cookook.co.kr $ test_for number is 0 number is 1 number is 2 $
반복 실행문 - for 명령행 인자 처리 가능 예 : test_for3 #!/bin/bash 텔넷 cookook.co.kr $ ./test_for3 user1 user2 user3 user1에게 메일을 보냈습니다. user2에게 메일을 보냈습니다. user3에게 메일을 보냈습니다. ------------------------ 모든 메일을 보냈습니다. $ #!/bin/bash # test_for3: 명령행 인자 처리 for person in $* do mailx $person < letter print ${person}에게 메일을 보냈습니다. done print ---------------------------- print 모든 메일을 보냈습니다.
반복 실행문 - 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 텔넷 cookook.co.kr $ test _while 1부터 10까지의 합 : 55 $
반복 실행문 - until 조건 명령이 정상 실행될 때까지 명령 반복 예 : test_until until 조건명령 do 명령 텔넷 cookook.co.kr $ ./test_until 로그인 이름 : hanb hanb pts/3 Aug 19 01:07 (192.168.0.2) $ 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. 삑 소리를 냄
반복 실행문 - 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 텔넷 cookook.co.kr $ test _select 1) pwd 2) date 3) quit 명령을 입력하세요 : 1 /export/home/user1/unix/ch13 명령을 입력하세요 : 3 $
루프 제어문 - continue 루프 안에서 사용 이후 실행 순서를 무시하고 루프의 처음으로 돌아가는 명령 숫자를 지정하면 중첩된 루프 안에서 특정 루프의 처음으로 돌아갈 수 있음 예 : test_cont #!/bin/bash # test_cont: continue 테스트 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 모든 메일을 보냈습니다.
06. 함수 함수 : 하나의 목적으로 사용되는 명령들의 집합 앨리어스와의 차이점 예 : trash 조건에 따라 처리 가능 인자 처리 가능 예 : trash function 함수이름 { 명령들 } 텔넷 cookook.co.kr $ mkdir ~/.TRASH $ function trash { > mv $* ~/.TRASH > } $
함수 확인 및 호출 정의된 함수 확인 함수 호출 $ typeset -f trash() { mv $* ~/.TRASH } $ 텔넷 cookook.co.kr $ typeset -f trash() { mv $* ~/.TRASH } $ 텔넷 cookook.co.kr $ touch a b c $ ls a b c $ trash a b c $ ls ~/.TRASH $
함수의 종료 - return 함수 종료 조건 지정한 값이 함수의 종료값으로 $?에 저장됨 return [ n ] 함수 본문 안의 마지막 문장 실행 return 문 실행 지정한 값이 함수의 종료값으로 $?에 저장됨 return [ n ]
함수의 종료 - return 예 : test_add $ add 3 4 3 + 4 = 7 $ # 함수 리턴값 테스트 #!/bin/bash # 함수 리턴값 테스트 function sum { typeset sum (( sum= $1 + $2 )) return $sum } sum $1 $2 print $1 + $2 = $? 텔넷 cookook.co.kr $ add 3 4 3 + 4 = 7 $
함수 삭제 - unset unset -f 함수명 정의된 함수를 삭제 사용 예 $ unset -f trash 텔넷 cookook.co.kr $ unset -f trash $ functions $
07. 디버깅 스크립트 실행도중 발생한 오류 수정 방법 구문 오류 쉘이 실행도중 구문오류가 발생한 라인번호 출력 실행 오류 오류 메시지 없이 실행이 안되거나 비정상 종료 오류 수정 방법 bash -x, trap
디버깅 : bash -x 가장 간단한 스크립트 실행 오류 수정방법 스크립트의 각 행이 실행될 때마다 화면에 출력됨 텔넷 cookook.co.kr $ bash -x test_while + count=1 + sum=0 + (( count <= 10 )) + (( sum+=count )) + let count+=1 (중략) + print 1부터 10까지의 합 : 55 1부터 10까지의 합 : 55 $ 스크립트의 내용
디버깅 : trap 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 텔넷 cookook.co.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
13장 요약 [3/3] 디버깅 스크립트의 실행 오류 수정 방법 bash -x script : 지정한 script를 한행씩 실행하며 결과를 화면에 출력 trap ‘명령’ DEBUG : trap 을 포함한 스크립트를 한 행씩 실행할 때마다 trap 안에 기술한 명령을 실행