820 likes | 992 Views
Shell Part 2. http://rainbow.sunmoon.ac.kr/~yypark http://ubilab.sunmoon.ac.kr. 배시 쉘 프로그래밍 ( 기본 ). 쉘 스크립트. 명령어가 명령행에서가 아니라 파일 안에서 실행될 때 , 이 파일을 쉘 스크립트라 함 대화형 기능으로 동작하지 않음 BASH_ENV 환경변수에서 지정한 파일 (‘BASH_ENV 파일’ ) 을 실행함 (.bashrc) 이러한 BASH_ENV 파일을 읽어들인 후 , 쉘은 스크립트 안의 명령어들을 실행.
E N D
Shell Part 2 http://rainbow.sunmoon.ac.kr/~yypark http://ubilab.sunmoon.ac.kr
쉘 스크립트 • 명령어가 명령행에서가 아니라 파일 안에서 실행될 때, 이 파일을 쉘 스크립트라 함 • 대화형 기능으로 동작하지 않음 • BASH_ENV 환경변수에서 지정한 파일(‘BASH_ENV 파일’)을 실행함 (.bashrc) • 이러한 BASH_ENV 파일을 읽어들인 후, 쉘은 스크립트 안의 명령어들을 실행 3
쉘 스크립트 작성절차 • 일반적으로 편집기에서 작성(vi, gedit 등) • 주석(‘#’ 기호)과 명령어로 구성 • 첫 번째 행 • 배시 쉘 프로그램 • 유닉스 명령어, 본 쉘 명령어, 프로그램 구조, 주석 등으로 이루어짐 #!/bin/bash : 항상 스크립트의 첫 행에 나와야 함 : 스크립트를 수행할 때 사용할 쉘의 이름을 지정 : 기호 ‘#!’는 매직넘버라 불림. 커널이 실행 프로그 램으로 인식해야 하는지의 여부를 나타냄 4
쉘 스크립트 실행권한 부여 • 파일 생성 후 적절한 권한이 주어져야 쉘 스크립트 실행이 가능함 5
쉘 스크립트 수행 간단한예제 • 스크립트 작성하기 (greetings) 6
쉘 스크립트 수행 간단한예제(Cont’d) • 스크립트 실행하기 (greetings) 7
내장명령어 ‘read’ • 파일이나 터미널로부터 입력을 읽어오기 위함 • 개행문자(\n)가 나타날 때 까지 행을 읽어들임 • 사용자가 엔터키를 입력할 때까지 프로그램을 일시 중지시키는 목적으로도 사용함 8
내장명령어 ‘read’ 예제 • 스크립트 작성하기 (nosy) 9
내장명령어 ‘read’ 예제(Cont’d) • 스크립트 실행하기 (nosy) 10
# declare –i 명령어를 사용하여 num 변수를 정수 타입으로 선언 # 문자열 hello를 정수타입 변수 num에 대입하려고 하면 대신 0의 값이 num 변수에 지정됨 # 스페이스는 사용하지 않거나 따옴표로 묶어야 함 # 스페이스를 따옴표로 묶었으므로 곱셈이 수행됨 # 변수가 정수타입이므로 부동소수점을 지정하면 구문에러발생 산술연산(정수타입계산) • ‘declare’ 명령어 (declare –i 사용) 11
# i 변수에 5를 저장 # let명령어가 i 변수에 1을 더함. 산술연산에서는 변수 치환을 위해 ‘$’를 사용할 필요가 없음 # 인자들에 스페이스가 있으면 따옴표를 사용 # 복합연산자 +=를 사용하여 i 변수에 1을 더함 # let명령어 대신 (( )) 명령어를 사용할수 있음 산술연산(정수타입계산) • ‘let’ 명령어 12
산술연산(부동소수점타입계산) • 배시 쉘은 기본적으로 정수타입만 계산 • bc, awk 등의 유틸리티를 사용하여 복잡한 계산 수행 13
위치 인자 • 스크립트 이름 다음에 공백 문자로 구분된 각 단어를 인자라 부름 • 명령행에서 스크립트에 필요한 정보를 넘겨줄 수 있음 • 명령어 ‘set’을 써서 설정 또는 재설정할 수 있고 이때 이전 설정 값은 지워짐 14
위치 인자 예제 • 스크립트 작성하기 (greetings2) 15
위치 인자 예제(cont’d) • 스크립트 실행하기 (greetings2) 16
‘set’ 명령어와 위치 인자 예제 • 스크립트 작성하기 (args) 17
‘set’ 명령어와 위치 인자 예제(Cont’d) • 스크립트 실행하기 (args) 18
# grep명령어의 종료상태가 성공적으로 수행했으므로 0이 된다 # test명령어는 문자열이나 숫자를 평가하거나, 파일을 검사하기 위해 사용. 0을 반환하면 표현식을 참으로 평가, 1이면 거짓임. 등호(=)기호 좌우에는 스페이스 삽입. # 대괄호를 test명령어 대신 사용할 수 있음 # test명령어에서는 와일드카드를 사용할 수 없음 # $x가 $y보다 큰지(-gt) 검사함. 0이면 참, 1이면 거짓 # $x가 $y보다 작거나 같은지(-le) 검사함. 0이면 참, 1이면 거짓 내장명령어 ‘test’ • 표현식의 평가에 일반적으로 사용 19
형식 형식 if 명령어 then 명령어 명령어 fi (문자열에 대해 test 사용 – new 형식) if [[ 문자열 조건식 ]] then 명령어 fi (숫자 및 문자열에 대해 test 사용 – old) if test조건식 then 명령어 fi (또는) if [ 문자열/수식 ] then 명령어 fi (숫자에 대해 let 사용 – new 형식) if (( 수식 )) ‘if’ 명령어 • 조건을 표현하기 위한 가장 간단한 형태 20
# ‘grep’명령어가 /etc/passwd 데이터베이스에서 변수 name을 찾는다. 표준 출력과 표준 에러는 /dev/null로 리다이렉션 됨 # ‘grep’명령어의 종료 상태가 0이면, then 에서부터 fi를 만날 때까지 나오는 문장들을 실행한다. # fi는 then다음에 나오는 명령어 목록의 끝을 의미한다. ‘if’ 명령어 예제 21
‘exit’ 명령어와 ‘?’ 변수 • ‘exit’명령어는 스크립트를 중지시키고 명령행으로 돌아가고자 할 때 사용함 • 특정 상황이 발생한 탓에 스크립트를 종료시켜야 할 경우 주로 사용 • 인자는 0~255 사이의 숫자 사용 가능 • 인자값 0 : 프로그램이 성공적인 수행을 마침 • 0이외의 값 : 성공적인 수행의 실패를 의미 • ‘exit’ 명령어에 주어지는 인자는 쉘의 ‘?’ 변수에 저장됨 22
‘exit’ 명령어와 ‘?’ 변수 예제 • 스크립트 작성하기 (bigfiles) 23
‘exit’ 명령어와 ‘?’ 변수 예제(Cont’d) • 스크립트 실행하기 (bigfiles) 24
형식 if 명령어 then 명령어(들) else 명령어(들) fi ‘if/else’ 명령어 • 양자택일(two-way decision making)을 표현하는데 사용함 • ‘if’ 다음의 명령어가 거짓으로 평가되면 ‘else’ 다음의 명령어를 실행함 25
‘if/else’ 명령어 예제 • 스크립트 작성/실행하기 (ifelseTest) 26
형식 if 명령어 then 명령어(들) elif 명령어 then 명령어(들) elif 명령어 then 명령어(들) else 명령어(들) fi ‘if/elif/else’ 명령어 • 다중택일(multi-way decision making)을 표현하는데 사용함 • ‘if’ 다음의 명령어가 거짓으로 평가되면 ‘elif’ 다음의 명령어를 평가하고 이 명령어의 수행이 성공하면 ‘then’ 이하의 문장을 실행 • 주어진 ‘elif’문장이 모두 실패인 경우 ‘else’이하의 문장이 실행됨 27
‘if/elif/else’ 명령어 예제(1) • 스크립트 작성하기 (tellme) 28
‘if/elif/else’ 명령어 예제(1)(Cont’d) • 스크립트 실행하기 (tellme) 29
‘if/elif/else’ 명령어 예제(2) • 스크립트 작성하기 (tellme2) 30
‘if/elif/else’ 명령어 예제(2)(Cont’d) • 스크립트 실행하기 (tellme2) 31
내장명령어 ‘null’ • 콜론(:)으로 나타냄 • 실제 아무런 작업도 하지 않으며 단지 종료 상태를 0으로 돌려줌 • 주로 ‘if’다음에 어떤 작업도 지정하고 싶지 않을 때 사용 (‘then’다음에 문장을 기술하지 않으면 에러가 발생하기 때문) • 무한루프를 작성할 때도 사용 32
형식 case 변수 in value1) 명령어(들) ;; value2) 명령어(들) ;; *) 명령어(들) ;; esac ‘case’ 명령어 • 다중분기(multiway branching) 명령어로써, if/elif 대신 사용가능 • ‘case’ 변수와 대응되는 ‘value’가 없으면 ‘*)’ 기호 다음에서부터 ‘esac’ 사이의 문장들을 수행함 • ‘*)’ 기호의 역할은 if/else 조건문에서 else와 동일 • ‘case’ 변수의 값에는 와일드카드나 |(OR연산자)를 사용할 수 없음 33
‘case’ 명령어 예제 • 스크립트 작성하기 (xcolors) 34
‘case’ 명령어 예제(Cont’d) • 스크립트 실행하기 (xcolors) 35
루프 명령어 • 루프 명령어는 명령어 혹은 명령어 집합을, 일정 회수만큼 반복하거나 특정한 조건을 만족할 때까지 계속 실행시켜야 하는 경우에 사용 • 배시 쉘에서는 for, while, until과 같은 세 가지 루프를 지원함 36
형식 for variable in word_list do 명령어(들) done ‘for’ 명령어 • ‘for’ 루프 명령어는 정해진 횟수의 반복을 위해 사용 • 일련의 파일이나 사용자에 대해 동일한 명령어들을 반복하여 실행시킴 • 변수(variable)에 단어가 대입되면 루프의 몸체에 해당하는 ‘do’와 ‘done’ 사이의 명령어들이 실행됨 37
‘for’ 명령어 예제(1) • 스크립트 작성/실행하기 (forloop) 38
‘for’ 명령어 예제(2) • 스크립트 작성/실행하기 (backup) 39
형식 while 명령어 do 명령어(들) done ‘while’ 명령어 • ‘while’ 명령어는 다음에 따라오는 명령어를 평가해서, 종료상태가 0이면 루프 몸체(do와 done사이)의 명령어들을 수행시킴 • ‘while’ 루프에 의해 명령어의 종료 상태가 0이 아닌 값으로 바뀔 때까지 루프가 계속됨 • 종료 상태가 0이 아닌 값인 경우 프로그램의 제어는 done 다음으로 옮겨져서 계속 실행 40
‘while’ 명령어 예제(1) • 스크립트 작성/실행하기 (num) 41
‘while’ 명령어 예제(2) • 스크립트 작성/실행하기 (quiz) 42
‘while’ 명령어 예제(3) • 스크립트 작성/실행하기 (sayit) 43
형식 until 명령어 do 명령어(들) done ‘until’ 명령어 • ‘while’ 명령어와 유사하게 사용되나 until 다음에 나오는 명령어가 실패해야 루프가 실행된다는 점이 다름 • 즉, 명령어의 종료 상태가 0이 아닌 경우에 루프가 수행됨 • 종료 상태가 0이 되면, 루프가 종료하고 키워드 done 다음 부분이 실행됨 44
‘until’ 명령어 예제 • 스크립트 작성/실행하기 (hour) 45
형식 select var in wordlist do 명령어(들) done ‘select’ 명령어 • 배시 쉘에서는 메뉴 생성을 위해 select라는 새로운 루프를 제공함 • 숫자(일련번호)를 선택 항목으로 사용하는 메뉴를 표준 에러로 출력하면 프롬프트 PS3을 이용해 사용자의 입력을 기다림(PS3의 기본값은 #? 이다) • 사용자가 입력한 값은 배시 쉘의 내장변수인 REPLY에 저장됨 46
‘select’ 명령어 예제(1) • 스크립트 작성/실행하기 (runit) 47
‘select’ 명령어 예제(2) • 스크립트 작성하기 (class) 48
‘select’ 명령어 예제(2)(Cont’d) • 스크립트 실행하기 (class) 49
루프 제어 명령어 • 특별한 상황이 발생하면, 루프를 탈출하거나, 루프의 시작 부분으로 되돌아가야 하는 경우 • 배시 쉘에서는 이러한 특정 상황을 처리할 수 있는 루프 제어 명령어들을 제공함 • shift, break, continue 등 50