쉘 프로그래밍 (shell programming)

프로그래밍/BASH SHELL|2015. 1. 27. 10:01
반응형

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 



반응형

'프로그래밍 > 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

댓글()