UNIX Unbounded A Beginning Approach
Download
Report
Transcript UNIX Unbounded A Beginning Approach
UNIX Unbounded
A Beginning Approach
이성현
Home : nimilx2.hannam.ac.kr
E-mail : [email protected]
Tel : +82-42-629-7559
HANNAM
Network Lab.
목차
유닉스 쉘 프로그래밍 언어 이해하기
추가적인 쉘 스크립트 작성하기
쉘 프로그래밍의 기초
산술 연산
루프(loop) 구조
쉘 프로그램 디버깅
요약
질의 및 응답
실습
유닉스 이론 및 실습
HANNAM
2
Network Lab.
유닉스 쉘 프로그래밍 언어 이해하기
간단한 스크립트 작성하기
■
who | wc –l
▶ 시스템에 접속한 사용자의 수를 알기 위한 스크립트 작성
유닉스 이론 및 실습
HANNAM
3
Network Lab.
유닉스 쉘 프로그래밍 언어 이해하기
스크립트 실행하기
■
스크립트 실행의 두 가지 방법
▶ 쉘 실행 명령어의 사용
▶ 쉘 스크립트를 실행 파일로 만들어 실행
■
스크립트 호출하기
▶ 스크립트 파일을 샐행하기 위해서 쉘 호출
▶ 쉘 스크립트 호출 절차
▶ Ex :
유닉스 이론 및 실습
사용자가 파일명을 지정
새로 호출한 쉘이 스크립트를 읽음
실행 파일에 나열된 명령어 해석
쉘 스크립트 내의 명령어 실행
sh won
bash won
ksh won
HANNAM
4
Network Lab.
유닉스 쉘 프로그래밍 언어 이해하기
스크립트 실행하기
■
실행 가능한 파일 만들기 : chmod 명령어
▶ 작성한 쉘 스크립트 파일을 실행 가능한 파일로 만듬
▶ chmod 명령어를 사용하여 해당 파일의 속성을 변환
문자
누가 영향을 받는가?
u
사용자/자신
g
그룹
o
그 밖의 사용자
a
모든 사용자 : ugo 조합 대신에 사용할 수 있다
문자
허가권한 범주
r
읽기 허가 권한
w
쓰기 허가 권한
x
실행 허가 권한
-
허가 권한 없음
연산자
유닉스 이론 및 실습
허가 권한 범주에 취해진 특정 행위
+
허가 권한 승인
-
허가 권한 거부
=
특정 사용자에 관한 모든 허가 지정
HANNAM Univ.
5
Network Lab.
유닉스 쉘 프로그래밍 언어 이해하기
스크립트 실행하기
■
실행 가능한 파일 만들기 : chmod 명령어
유닉스 이론 및 실습
HANNAM Univ.
6
Network Lab.
추가적인 쉘 스크립트 작성하기
쉘 프로그래밍의 특징
▶ 간단한 프로그램 작성법을 따른다
▶ 사용자 사용권한을 위한 강력한 도구이다
▶ 사용자 파일에 임의의 명령어나 일련의 명령어를 추가할 수 있다
▶ 실행 파일의 생성이 가능하다
▶ $ 프롬프트에 실행 파일의 입력을 통해 간단하게 실행할 수 있다
내장된 곳
명령어
Bourne Shell
Korn Shell
Bourne Again
Shell
exit
sh
ksh
bash
for
sh
ksh
bash
if
sh
ksh
bash
ksh
bash
let
유닉스 이론 및 실습
read
sh
ksh
bash
test
sh
ksh
bash
until
sh
ksh
bash
while
sh
ksh
bash
HANNAM Univ.
7
Network Lab.
추가적인 쉘 스크립트 작성하기
쉘 스크립트 예제 2
유닉스 이론 및 실습
HANNAM Univ.
8
Network Lab.
추가적인 쉘 스크립트 작성하기
쉘 스크립트 예제 3
유닉스 이론 및 실습
HANNAM Univ.
9
Network Lab.
추가적인 쉘 스크립트 작성하기
특수 문자 사용하기
echo 명령어는 특수 문자를 인식
■ 특수 문자는 “\”로 시작하고, echo 명령어의 매개변수 문자열로 사용
■
■
ex)
▶ $ echo “\n\n\n” [Enter]
이스케이프 문자
\b
백스페이스
\c
출력 문자열의 마지막에 디폴트 다음 라인([Return] 키)을 금지
\n
캐리지 리턴(carriage return)과 폼 피드 다음 라인([Return] 키)
\r
라인 피드(linefeed) 없이 캐리지 리턴
\t
탭(tab) 문자
\0n
유닉스 이론 및 실습
기능
문자의 ASCII 코드를 표현하기 위한 8진수, 1, 2, 또는 3에 이은 제로
로
HANNAM Univ. 10
Network Lab.
추가적인 쉘 스크립트 작성하기
스타일에서 로그오프
■
로그오프
▶ 일반적으로 로그오프나 사용자 세션을 닫기 위해 [Ctrl+d]나 exit 사용
▶ ex)
$ cat bye [Enter]
exit
$
$ chmod u+x bye [Enter]
Bye [Enter]
$
▶ 위의 예에서 exit를 실행하지 않는 이유
사용자가 쉘에게 명령어를 전달할 때, 명령어를 실행하기 위해 자식 프로세스 생성
사용자 로그인 쉘은 부모 프로세스이고, 사용자 스크립트 파일인 bye는 자식 프로세스
자식 프로세스가 제어를 넘겨 받은 동시에 자식 프로세스를 종료하기 위해 exit 실행
자식 프로세스가 죽었을 경우, 제어를 부모 프로세스가 넘겨받아 $ 프롬프트가 출력
즉 : 자식 프로세스가 시작된 직후 종료되기 때문에 스크립트를 실행하지 않음
bye 스크립트를 실행하기 위해서 .(dot) 명령어를 사용하여, 자식 프로세스를 생성하지 않
아야 exit를 실행
유닉스 이론 및 실습
HANNAM Univ. 11
Network Lab.
추가적인 쉘 스크립트 작성하기
명령어 실행하기 : .(dot) 명령어
사용자가 현재의 쉘에서 프로그램을 실행하고, 쉘이 자식 프로세스를 생성하
지 못하게 하는 명령어
■ 사용자 시작 파일인 .profile과 같은 스크립트 파일을 시험하기를 원하는 경
우 유용하게 사용
■
유닉스 이론 및 실습
HANNAM Univ. 12
Network Lab.
추가적인 쉘 스크립트 작성하기
명령어 실행하기 : .(dot) 명령어
■
경로 변경
▶ 사용자는 PATH 쉘 변수를 변경할 수 있고, 사용자의 Home 디렉토리를 추가할 수 있음
▶ 사용자의 Home 디렉토리는 명령어를 찾기 위해 검색
▶ ex)
$ echo $PATH [Enter]
PATH=\bin:\usr\bin
$ PATH=$PATH:$HOME [Enter]
$ echo $PATH [Enter]
PATH=:\bin:\usr\bin:usr\students/david
$
■
명령어 치환
▶ 매개변수 문자열에 명령어의 출력을 넣을 수 있음
▶ 쉘이 인용부호로 둘러싸인 명령어를 실행한 후, echo로 전달된 문자열에 명령어의 출력을 치환
▶ ex)
$ echo your current directory; ‘pwd’ [Enter]
유닉스 이론 및 실습
HANNAM Univ. 13
Network Lab.
추가적인 쉘 스크립트 작성하기
입력 읽기 : read 명령어
변수 값을 할당하기 위한 방법 중 하나는 대입 연산자(=)를 사용하는 것
■ 사용자가 표준 입력장치로부터 문자열을 읽음으로써 변수에 값을 저장
■
▶ 사용자 입력을 위해 read 명령어 사용
▶ read 명령어를 통해 읽은 값을 사용자 변수에 저장
사용자가 값을 할당하는 가장 일반적인 방법으로 대화형 프로그램에서 많이
사용
■ 명령어 실행 절차
■
▶ read가 실행되면, 쉘은 사용자가 텍스트의 한 라인을 입력할 때까지 대기
▶ 하나 이상의 변수에 입력한 텍스트를 저장
▶ 변수들은 명령어 라인에서 read 한 후에 나열되며, 사용자 입력의 끝은 [Enter] 키를 누를 때 종
료
■
read 명령은 대개 echo와 함께 사용
유닉스 이론 및 실습
HANNAM Univ. 14
Network Lab.
추가적인 쉘 스크립트 작성하기
입력 읽기 : read 명령어
■
스크립트 예
유닉스 이론 및 실습
HANNAM Univ. 15
Network Lab.
추가적인 쉘 스크립트 작성하기
입력 일기 : read 명령어
유닉스 이론 및 실습
HANNAM Univ. 16
Network Lab.
쉘 프로그래밍의 기초
쉘 프로그래밍
다른 프로그래밍 언어와 마찬가지로 일련의 명령어 제공
■ 프로그램이 구조화(well-structured)되어 있음
■ 프로그램이 일기 쉽고(readable) 유지 보수가 용이
■
주석
■
■
■
■
■
프로그램의 문서화(documentation)는 컴퓨터 프로그램을 작성할 때나, 쉘
스크립트 프로그램을 작성할 때 매우 중요
문서화는 프로그램의 목적과 로직(logic)과 프로그램에서 명백하지 않은 명
령어를 설명하고자 할 때 필수적인 요소
문서화는 프로그램을 다른 사람이 읽기 쉽도록 표현
쉘은 # 기호를 주석으로 인식
ex)
▶ #
# program version 3
유닉스 이론 및 실습
HANNAM Univ. 17
Network Lab.
쉘 프로그래밍의 기초
변수(variable)
유닉스 쉘도 다른 프로그래밍 언어와 마찬가지로 변수를 생성하여 값을 저장
■ 변수에 값을 저장하기 위해서 간단한 변수명 생성후 등호 표시(=)를 이용하
여 변수에 값을 저장
■ 유닉스 쉘 프로그래밍 언어는 정수형, 문자형, 부동 소수점과 같은 자료형을
지원하지 않음
■
▶ ex)
$ Count=1 count라는 변수에 1이라는 값을 저장
쉘은 인터프리터 언어(interpretive language)이며, 명령어나 변수를 $ 프롬
프트에 직접적으로 입력하여 쉘 스크립트에 기술
■ ex)
■
▶ $ Header=“The Main Menu” [Enter]
$ BUG=insect [Enter]
유닉스 이론 및 실습
HANNAM Univ. 18
Network Lab.
쉘 프로그래밍의 기초
변수(variable)
unset 명령어를 사용하여 변수를 지우거나 쉘 스크립트가 종료될 때까지 메
모리에 보존
■ ex)
■
▶ $ unset XYZ [Enter]
■
변수의 출력
▶ Echo 명령어를 사용하여 변수의 내용을 출력
ex)
$ echo $variable
■
명령어 치환
▶ 역인용 부호(``)안에 명령어를 삽입하고 명령어를 실행할 경우, 변수의 출력에 명령어의 실행 결과
를 치환
▶ Ex)
$ DATE=`date` [Enter]
$ echo $DATE [Enter]
유닉스 이론 및 실습
HANNAM Univ. 19
Network Lab.
쉘 프로그래밍의 기초
명령 라인 매개변수
쉘 스크립트는 특수한 변수(위치 변수 또는 매개 변수)에 있는 명령 라인으
로부터 10개의 명령 라인 매개변수(인자)를 읽을 수 있음
■ 명령 라인 인자는 보통 명령어를 공백으로 구분하여 입력
■ 입력된 인자는 프로그램에서 처리되며, 프로그램의 동작이나 특별한 명령에
서 실행할 수 있도록 변경
■
변수
$0
$1, $2, … $9
유닉스 이론 및 실습
의미
명령 라인에 입력된 스크립트의 이름을 포함
첫 번째부터 아홉 번째까지 각각의 명령 라인 파라미터를 포함
$#
명령 라인 파라미터의 개수를 포함
$@
모든 명령 라인 파라미터를 포함
$?
마지막 명령어의 결과에 대한 상태 값을 포함
$*
모든 명령 라인 파라미터를 포함
$$
수행 중인 프로세스의 PID를 포함
HANNAM Univ. 20
Network Lab.
쉘 프로그래밍의 기초
명령 라인 매개변수
■
특별한 쉘 변수 이용
유닉스 이론 및 실습
HANNAM Univ. 21
Network Lab.
쉘 프로그래밍의 기초
명령 라인 매개변수
■
변수 할당
▶ 위치 변수에 값을 할당하는 다른 방법은 set 명령어를 사용하여 명령 인자에 값을 입력
유닉스 이론 및 실습
HANNAM Univ. 22
Network Lab.
쉘 프로그래밍의 기초
명령 라인 매개변수
■
프로그램의 종료 : exit 명령어
▶ ex)
exit n
▶ n의 위치는 프로그램의 루틴이 끝나는 지점에 대한 상태를 나타내며, 반환보드(RC; Return
Code)라고 한다
▶ 다른 유닉스 프로그램에서 모두 일치하도록, 보통 결과에 따라 상태 코드를 반환
▶ 부모 프로세스에세 루틴이 끝나는 지점에 대한 상태를 반환하도록 쉘 스크립트 파일을 프로그램
할 수 있음
▶ $ 프롬프트에서 exit 명령어는 로그인 쉘을 종료하고, 로그오프
유닉스 이론 및 실습
HANNAM Univ. 23
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
쉘 스크립트를 작성하는데 필요한 제어를 통해 다른 명령어의 결과에 따라
명령어가 수행하도록 작성
■ 유닉스에서 수행되는 모든 명령어는 프로그램의 흐름을 제어하기 위한 숫자
를 반환
■
▶ 0(zero) : 명령어의 성공적인 수행
▶ 다른 숫자 : 명령어의 실패 조건에 해당
■
If-then 구조
▶ if 문장은 조건이 참인지, 거짓인지를 확인하는 메커니즘을 제공
▶ if 문장의 수행 결과에 따라 프로그램에서 명령어 수행의 순서를 변경
▶ ex)
if [condition]
then
commands
….
last command
fi
유닉스 이론 및 실습
HANNAM Univ. 24
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
if-then 구조
유닉스 이론 및 실습
HANNAM Univ. 25
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
if-then-else 구조
▶ if 구조에 else 절을 추가함으로써, 거짓 상태를 반환하는 경우 수행하는 명령어들을 정확히 입력
할 수 있도록 해줌
▶ ex)
if [condition]
then
true-commands
……
last-true-command
else
false-commands
……….
last-false-command
fi
유닉스 이론 및 실습
HANNAM Univ. 26
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
if-then-else 구조
유닉스 이론 및 실습
HANNAM Univ. 27
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
if-the-elif 구조
▶ 스크립트 파일에 if와 else 구조를 연속해서 여러 번 사용하는 경우, elif 문장을 사용
▶ ex)
if [condition_1]
then
commands_1
elif [condition_2]
then
commands_2
else
command_n
fi
유닉스 이론 및 실습
HANNAM Univ. 28
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
if-then-elif
유닉스 이론 및 실습
HANNAM Univ. 29
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
참 또는 거짓 : test 명령어
▶ test는 표현식이 참 또는 거짓을 경우 해당하는 값을 반환하는 쉘 명령에 내장된 명령어
▶ 표현식은 두수가 도수가 동일한지를 비교하는 것처럼 간단하거나 논리 연산자와 관련된 몇 개의
명령어를 테스트하는 것처럼 복잡할 수 있음
▶ test 명령은 스크립트 파일을 작성하는데 매우 유용
유닉스 이론 및 실습
HANNAM Univ. 30
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
서로 다른 범주 시험하기
▶ test 명령을 시험하기 위해서 두 개의 정수를 사용
▶ 논리 연산자로 두 수를 비교하는 표현을 조립
ex)
$ test expression_1 logical operator expression_2
▶ 논리 연산자
and 논리 연산자(-a) : 양쪽 상태가 참일경우 0을 반환
or 논리 연산자(-o) : 양쪽 중 하나의 상태가 참일 경우 0을 반환
not 논리 연산자(!) : 상태가 거짓을 경우 0을 반환
연산자
예제
-eq
number1 –eq number2
number1은 number2와 같은가?
-ne
number1 –ne number2
number1은 number2와 같지 않은가?
-gt
number1 –gt number2
number1은 number2보다 큰가?
-ge
number1 –ge number2
number1은 number2와 크거나 같지 않은가?
-lt
number1 –lt number2
number1은 number2와 작은가?
-le
number1 –le number2
number1은 number2와 작거나 같지 않은가?
유닉스 이론 및 실습
의미
HANNAM Univ. 31
Network Lab.
쉘 프로그래밍의 기초
조건과 테스트
■
서로 다른 범주 시험하기(숫자값)
유닉스 이론 및 실습
HANNAM Univ. 32
Network Lab.
쉘 프로그래밍의 기초
서로 다른 범주 시험하기
■
문자 값
▶ test 명령으로 문자를 비교
▶ test 명령은 문자를 비교하는데 다른 연산자를 제공
연산자
예제
의미
=
string1 = string2
String1과 string2는 일치하는가?
!=
string1 != string2
String1과 string2는 일치하지 않는가?
-n
-n string
String 문자(길이 0)를 포함하는가?
-z
-z string2
String1은 빈 문자(길이 0)인가?
▶ ex)
$ STRING5 [Enter]
$ test –z $STRING [Enter]
test: Argument expected
유닉스 이론 및 실습
HANNAM Univ. 33
Network Lab.
쉘 프로그래밍의 기초
서로 다른 범주 시험하기
■
파일
▶ test 명령어를 사용해서 파일 크기, 파일 종류, 파일 실행 권한과 같은 특징을 볼 수 있음
▶ 10개 이상의 파일의 특징을 확인
연산자
예제
의미
-r
-r filename
filename이 있고, 읽을 수 있는가?
-w
-w filename
filename이 있고, 쓸 수 있는가?
-s
-s filename
filename이 있고, 0이 아닌 길이인가?
-f
-f filename
filename이 있고, 이것이 디렉토리 파일이 아닌가?
-d
-d filename
filename이 있고, 이것이 디렉토리 파일인가?
▶ ex)
$ FILE=myfile [Enter]
$ IF test –r “$FILE” [Enter]
READABLE
유닉스 이론 및 실습
HANNAM Univ. 34
Network Lab.
쉘 프로그래밍의 기초
서로 다른 범주 시험하기
유닉스 이론 및 실습
HANNAM Univ. 35
Network Lab.
쉘 프로그래밍의 기초
매개변수 치환
쉘에서 매개 변수에 서술된 옵션에 따라 간단하게 바꾸는 매개 변수 치환을
제공
■ 설정된 변수가 무엇으로 설정되었는지 알기 위해서 사용
■
변수 옵션
의미
$variable
variable에 저장된 값
${variable}
variable에 저장된 값
${variable:-string}
설정되고 비어있지 않으면, variable의 값: 그렇지 않으면 문
문자 값
${variable:+string}
설정되고 비어있지 않으면, variable의 값: 그렇지 않으면 아
아무것도 아니다
${variable:=string}
설정되고 비어있지 않으면, variable의 값: 그렇지 않으면
variable은 string의 값이 설정됨
${variable:?string}
설정되고 비어있지 않으면, variable의 값: 그렇지 않으면, 스
스트링의 값이 출력되고 종료된다.
유닉스 이론 및 실습
HANNAM Univ. 36
Network Lab.
쉘 프로그래밍의 기초
매개변수 치환
유닉스 이론 및 실습
HANNAM Univ. 37
Network Lab.
산술 연산
산술 연산
쉘은 산술 연산에 대한 간단한 내장 연산자를 포함하고 있지 않음
■ x=$x +1의 경우처럼 x에 1을 더하는 것이 아니라 문자열 x에 문자열 +1을
추가하는 것으로 인식
■
산술 연산(sh) : expr 명령
■
산술연산자와 상수를 계산하기 위한 명령어
▶ ex)
$ expr 1+2 [Enter]
3
$ expr 10\% 3 [Enter]
1
■
관계 연산자
▶ expr 명령은 숫자연산과 숫자가 아닌 구문에 대한 관계 연산을 제공
▶ ex)
$ expr Gabe = Gabe [Enter]
1
$ expr 10 \> 20 [Enter]
0
유닉스 이론 및 실습
HANNAM Univ. 38
Network Lab.
산술 연산
산술 연산자(ksh) : let 명령어
정수 연산을 위한 명령어
■ expr 명령어와 비슷하며, 모든 기본적인 산술 연산을 제공
■
▶ ex)
$ x=100 [Enter]
$ let x = x+1 [Enter]
$ echo $x [Enter]
101
■
let 명령어는 변수의 값을 사용하는 것이 가능
▶ $x 대신에 x라고 입력하면 변수 x의 값을 사용
유닉스 이론 및 실습
HANNAM Univ. 39
Network Lab.
루프(loop) 구조
반복 구조
문장이나 명령어를 반복하기 위해 사용
■ 프로그래머에게 많은 기능과 유연성을 제공
■ 세 가지 반복 구조를 가짐
■
▶ for, while, until
for 루프: for-in-done 구조
■
지정한 숫자만큼 명령어를 수행하는 기능을 제공
▶ ex)
for variable
in list-of-value
do
command
….
last command
done
유닉스 이론 및 실습
HANNAM Univ. 40
Network Lab.
루프(loop) 구조
for 루프 : for-in-done 구조
유닉스 이론 및 실습
HANNAM Univ. 41
Network Lab.
루프(loop) 구조
while 루프 : while-do-done 구조
지정된 숫자만큼 명령어를 수행하는 기능을 제공
■ for 루프와 달리 조건(condition)이 참인 경우에만 루프를 수행
■
▶ ex)
while [condition]
do
commands
…
last command
done
do와 done 사이의 명령어는 루프 조건이 참(true, 0이 아닌 경우)인 경우에
만 반복 수행
■ 최종적으로 루프 조건에 거짓(false, 0인 경우)를 반환
■
유닉스 이론 및 실습
HANNAM Univ. 42
Network Lab.
루프(loop) 구조
while 루프 : while-do-done 구조
유닉스 이론 및 실습
HANNAM Univ. 43
Network Lab.
루프(loop) 구조
until 루프 : until-do-done 구조
루프의 조건이 거짓인 동안에만 명령어를 반복하는 점을 제외하고는 while
과 매우 유사
■ 다른 이벤트에 연관되어 수행되는 스크립트를 작성하는데 유용
■
▶ Ex)
untile [condition]
do
command
….
last command
done
■
첫 번째 수행에서 루프가 참이라면, 반복 구문은 한번도 수행되지 않는 경우
가 발생
유닉스 이론 및 실습
HANNAM Univ. 44
Network Lab.
루프(loop) 구조
until 루프 : until-do-done 구조
유닉스 이론 및 실습
HANNAM Univ. 45
Network Lab.
쉘 프로그램 디버깅
쉘 명령어
스크립트 파일을 디버깅하기 위해 sh, ksh, bash 명령어에 옵션을 사용
■ -x 옵션은 디버깅 수행 과정을 출력
■
■
sh 옵션
옵션
수행 기능
-n
명령을 읽기만 하고, 실행하지 않는다
-v
사용자 입력 부분을 그대로 출력한다
-x
스크립트가 실행될 때의 자세한 인자와 명령, 변수들의 정보를 보여준다
▶ Ex) $ sh –x BOX
유닉스 이론 및 실습
HANNAM Univ. 46
Network Lab.
쉘 프로그램 디버깅
쉘 명령어
유닉스 이론 및 실습
HANNAM Univ. 47
Network Lab.
쉘 프로그램 디버깅
쉘 명령어
유닉스 이론 및 실습
HANNAM Univ. 48
Network Lab.
요약
쉘 프로그래밍의 이해
쉘 프로그램에서의 변수 지정
쉘 프로그램에서의 제어 구문
쉘 프로그램에서의 반복 구문
쉘 프로그램의 디버깅
유닉스 이론 및 실습
HANNAM Univ. 49
Network Lab.
질의 및 응답
유닉스 이론 및 실습
HANNAM Univ. 50
Network Lab.
실습
쉘 프로그래밍 예제의 작성과 실행
유닉스 이론 및 실습
HANNAM Univ. 51