쉘 프로그래밍 (shell programming)
unix 시스템의 사용자는 여러 개의 쉘 명령어들을 똑같은 순서로 반복해야 하는
경우가 있을 수 있다. 이런 경우 명령어들을 파일로 저장해두고 쉘 명령어처럼
사용할 수가 있는데, 이런 파일들을 쉘 script 또는 쉘 program 이라 한다.
쉘이 쉘 program을 실행하기 위하여는 program 파일을 읽고 각 줄을 실행할 수
있어야 한다. 그래서, 해당 쉘 program 파일에 대해 read(읽기)와 execute(실행하기)
권한이 주어져야 한다.
쉘 스크립트의 문법은 쉘의 종류에 따라 다소의 차이가 있으며, 유닉스
시스템에서 초기 구동시 참고하는 파일들이 대부분 bourne 쉘 문법으로 되어
있기에 여기서는 bourne 쉘 문법을 중심으로 전개하려 한다.
자, 그럼 sample program을 만들어 보자.
$ cat sample_pgm
# this is sample program
who am i
ls -f
$ chmod +x sample_pgm
$ sample_pgm
위의 sample 예제는 login name을 알아보고 현재 디렉토리의 파일 목록을 출력하는
program이다.
5번째 줄에서 실행 가능하도록 execute 권한을 부여하였다.
쉘 script의 인수(argument)
파일을 복사해 주는 cp 명령어를 생각해보면 cp 명령어 다음에 복사할 파일명과
복사될 파일명을 입력해야 한다.
이처럼 대부분의 명령어들이 인수를 허용하는데, 쉘 script에도 인수 이용이
가능하다.
사용법을 살펴보면,
쉘 프로그램 이름 arg1 arg2 … argn
쉘 프로그램 내에서 각 인수는 $0 (program 이름), $1(arg 1), $2(arg 2)…$n(arg n)으로
참조된다.
사용예는 다음과 같다.
$ cat sample_2
echo your program name : $0
echo first argument : $1
echo second argument : $2
$ chmod +x sample_2
$ sample_2 love dream
your program name : sample 2
first argument : love
second argument : dream
쉘 변수 할당하기
쉘 script는 쉘 변수라는 기능을 사용하여, 보다 더 유연하게 작성될 수 있다.
쉘 변수는 문자열을 저장하는데 사용하는 하나의 이름이다.
변수 값은 문자열이 된다.
변수 이름 다음에 등호(=)와 변수 값을 기입함으로서 변수에 값을 줄 수
있다.
예를 들어 bin이란 변수에 "bin"이란 값을 주려면,
$ bin=bin
$ export bin
두번째 줄은 bin을 지역변수에서 전역변수로 바꿔주는 명령어이다.
쉘 명령에서 변수의 값을 참조하려면 변수명 앞에 $를 붙여 사용한다.
예를 들어,
$ cd/usr/$bin
$ pwd
/usr/bin
cd 명령을 실행하기 앞서 쉘은 bin이라는 변수 이름 대신 변수의 값
"bin"으로 대체한다.
결국,
$cd/usr/bin 이라 입력한 것과 같다.
exit명령어와 return명령어
exit 명령어
쉘 program을 종료하고 반환 code를 설정한다.
사용법은.
exit [arg]
return 명령어
함수의 실행을 정지하고 호출 프로시저로 돌아간다.
사용법은,
return [arg]
호출 프로시저가 없을 경우 return 명령어는 exit와 같다.
return codes
unix의 모든 명령은 명령이 완료될 때 반환 code를 생성한다.
명령이 정상적으로 종료되었으면 0을 return시키고 오류가 났으면 0이 아닌
값을 반환한다.
리턴코드는 쉘 변수인 $?로 참조할 수 있다.
상용법을 살펴보면,
$ ls
$ echo $?
0
쉘 변수$?은 최종적으로 return된 값을 참조한다.
$ true
$ echo $?
0
true명령은 항상 0을 되돌려 준다.
$ false
$ echo $?
1
false명령은 항상 1을 반환한다.
$ cp
$ echo $?
1
인수가 빠져 있기에 오류가 발생함.
test 명령어
test 명령어
test 명령어는 표현식을 평가하고 반환code를 생성하는데 사용한다.
test 명령어는 정수와 문자열과 파일의 조건을 검사하는 데에 사용될
수 있으며, 일반적으로 if문과 while문 등의 조건부 흐름 제어에
사용한다.
사용법은,
test expression or [expression]
표현식이 true이면 0을 return하고 false이면 0이 아닌 값을 return한다.
수식 평가
수식을 평가하는 데에의 표현식 사용법은,
[숫자 관계 숫자]
여기서 관계는,
-lt
: less than
-le
: less than or equal to
-gt
: greater than
-ge
: greater than or equal to
-eq
: equal to
-ne
: not equal to
예를 들어 x를 3이라 가정하면,
$ [ $x -lt 7]
$ echo $?
0
$ [ $x -gt 7]
$ echo $?
1
문자열 평가
test 명령에서 문자열을 평가할 때의 표현식은,
[문자열1 = 문자열2] : 문자열이 같은 지를 평가함.
[문자열1 != 문자열2] : 문자열이 다른 지를 평가함.
예를 들어보자.
$ x=abc
$ [ $x ="abc"]
$ echo $?
0
$ [ $x !="abc"]
$ echo $?
1
문자열에는 반드시 ""나''부호를 사용해야 한다.
문자열 연산자에는,
-z 문자열
: 문자열의 길이가 0이면 참
-n 문자열
: 문자열의 길이가 0이 아니면 참
파일 평가
test 문에서 파일이 디렉토리인지 파일인지를 평가할 수 있다.
사용법은,
test -Option filename
여기서 Option은,
-f
: filename이 파일이면 참.
-d
: filename이 디렉토리이면 참.
-s
: 파일이 존재하며 크기가 0보다 크면 참.
-r
: 파일이 존재하며 읽기 가능하면 참.
-w
: 파일이 존재하며 쓰기 가능하면 참.
-x
: 파일이 존재하며 실행 가능하면 참.
다른 연산자
test 명령어에서 다음의 연산자를 사용하면 복수 검사가 가능하다.
-o
: or
-a
: and
!
: not
\(\)
: grouping
예를 들어,
$ test -s filename -a -r filename
파일이 존재하고 size가 0보다 크며 그리고(and) 읽기 가능한지를
검사함.
산술식 표현
본격적으로 반복문을 시작하기 전에, 쉘 script에서의 산술식 표현 방법을
알아보자.
산술식 표현 방법은,
let expression or ((expression))
예를 들어보자.
$ x=10
$ y=2
$ ((x=x+2))
$ echo $x
12
쉘 script에서의 산술식은
let 명령을 사용하거나,
괄호를 두 개 사용하여 표현하거나
expr 명령어를 이용한다.
예를 들어보자.
$ let x=x+6
$ echo $x
18
$ let "x=x/(y+1)"
$ echo $x
6
산술식 표현 속에 괄호는 평가 순서를 바꾸는 데 사용될 수 있다.
이런 경우 큰 따옴표를 써야함을 유의하자.
위의 형식에 대한 바른 표현은,
let "x=x/(y+1)"또는 ((x=x/(y+1))) 또는 x=`expr $x/($y+1)`
[참고] ` (back qoute)
expr 을 사용한 예를 더 살펴보자.
$ expr 30 "*" 30
900
if 문
if 문은 program을 조건에 따라 분기시킨다.
사용법을 살펴보면,
if
list a
then
list b
fi
사용예는 다음과 같다.
if
test -s funfile
then
echo funfile exists
fi
funfile이 존재하고 크기가 0이 아니면 "funfile exists"라는 message를 화면에
뿌린다.
반복문 (loop문)
반복문은 일련의 명령을 반복할 수 있게 한다.
반복을 계속할 지는 키 명령의 반환 코드에 기초하여 이루어진다.
if 문이나 case 문은 key word로 시작되고 거꾸로 된 key word로 끝나는 반면
반복문은 키워드와 어떤 조건으로 시작하고 내부는 do/done으로 둘러
쌓이게 된다.
반복문은 아래의 3가지 형태이다.
while 문
while…
do
done
until 문
until…
do
done
for 문
for…
do
done
while 문
while 문은 조건이 참인 동안은 loop를 반복한다.
사용법을 살펴보면,
while
list a
do
list b
done
사용예[1]은 다음과 같다
$cat sample_while
x=1
while((x<=10))
do
echo x is $x
let x=x+1
done
$sample_while
x is 1
x is 2
?BR> ?BR> ?
x is 10
위의 예에서 알 수 있듯이 조건식인 ((x<=10))이 참인 동안은 loop 내부를 반복하게
된다. 그래서, 무한 loop에 빠지지 않아야 함을 주의하자.
사용예[2]는 다음과 같다
$ cat sample_while2
ans=yes
while
[ $ans = "yes" ]
do
echo enter a name
read name
echo yes or no
read ans
done
$ chmod 777 sample_while2
$ sample_while2
until 문
until 문은 조건식이 참이 될 때까지 loop를 반복한다.
(비교 : while 문은 조건이 참인 동안 loop가 계속된다.)
사용법을 살펴보면,
until
list a
do
list b
done
사용예는 다음과 같다.
$ cat sample_until
x=1
until((x>10))
do
echo x is $x
let x=x+1
done
$ sample_until
x is 1
x is 2
?BR> ?BR> ?BR> x is 10
위의 예에서 알 수 있듯이 until 문은 조건이 참이 될 때 까지 반복된다.
for 문
for 문은 list에 있는 각 item들이 for 반복문에 순차적으로 할당되어 소진될 때 까지
loop를 실행한다.
사용법을 살펴보면,
for var list
do
list
done
사용예는 다음과 같다.
$ cat sample_for
for x in 1 2 3 4 5
do
echo " 2 * $x is \c"
let x=x=+2
echo $x
done
$ sample_for
2*1 is 2
2*2 is 4
?BR> ?BR> ?BR> 2*5 is 10
break, continue, exit
반복문에서 loop를 중단시킬 필요가 있을 때가 있을 수 있다.
break 와 continue 는 무조건적인 흐름 제어를 제공한다.
exit
전체 프로그램이 종료되어야 할 경우 사용한다.
프로그램을 완전히 종료하고 쉘 프롬프트로 나가게 한다.
break
loop 를 종료하고 done 다음의 명령을 계속하여 수행하도록 한다.
continue
loop 의 나머지 명령을 중단하고 loop 의 맨 위로 가게 한다.
즉, continue는 단지 한번의 loop를 종료하고 loop의 맨 위에서 loop를 계속하게
하며, break는 loop를 빠져나가 다음 단계를 계속 수행하게 한다.
사용예는 다음과 같다.
$ cat sample_break
while
true
do
echo "enter file name to remove :\c"
read file
if test ! -f $file
then
cho $file is not a require file
continue
fi
echo removing $ file
rm $file
break
done
[출처] 쉘 프로그래밍 (shell programming) |작성자 박신양
'프로그래밍 > BASH SHELL' 카테고리의 다른 글
정규식 이해 (0) | 2015.01.27 |
---|---|
쉘 명령 기초 (0) | 2015.01.27 |
쉘 프로그래밍을 연마하자 (3) (0) | 2015.01.27 |
쉘 프로그래밍을 연마하자 (2) (0) | 2015.01.27 |
쉘 프로그래밍을 연마하자 (1) (0) | 2015.01.27 |