본문 바로가기

Learning/└◆Shell Scripts

[Shell Scripting] 본(Born) 쉘 프로그래밍

 

 

6 장 본쉘프로그래밍

 

 

------------------------------------

1. 쉘프로그램이란?

2. 쉘프로그램 만드는 방법과 실행

3. 스크립트 입출력

4. 쉘프로그램의 시작

5. test 구문과 []

6. 조건문

7. 반복문

8. 함수

9. 대화형 스크립트

10. 함수

11. trap

------------------------------------

 

 

 

 

 

 

1

쉘 프로그램이란?

 

 

 

쉘의 특징을 이용하여 프로그램을 하는 것을 쉘프로그램 또는 쉘스크립트라고 한다. 쉘 명령어들의 묶음 형태의 파일이 될수도 있다. 쉘프로그래밍은 쉘의 기능을 이용하여 만들어 지는 것이기 때문에 ~/.profile도 하나의 스크립트라고 할 수 있다. 이 장에서는 쉘프로그램과 쉘스크립트 용어를 혼용하여 사용한다.

 

 

 

 

 

 

2

쉘 스크립트 만드는 방법과 실행

 

 쉘 스크립트 실행 방법의 4종류

# sh script.sh(EX: 디버깅)

# . script.sh(EX: 환경파일)

# chmod u+x script.sh ; ./script.sh

# vi script.sh ; chmod u+x script.sh ; ./script.sh(EX: 쉘스크립트)

 

 

첫 번째 방법

# vi testfile.sh

 

ls -l

cal

 

 

# sh testfile.sh

-> 정상적으로 실행된다.

=> Shell을 지정해서 사용하는 방법, sh로 sub shell로 born shell이 뜨고 형식이 born shell로 되어있어야 한다.

born shell과 corn shell은 방식이 완전히 다르기 때문에


특성

1. read 권한만 있어도 실행 ( +r ) 실행권한이 없어도 가능

2. sub shell을 마음대로 선택할 수 있다.


 

# sh testfile.sh

위와 같은 방법을 통해 스크립트를 만들어서 실행 할때 특징은 다음과 같다.

일반사용자는 읽기 권한만 있어도 된다. 하지만 root 사용자는 읽기 권한이 없어도 실행이 된다.

쉘스크립트를 실행하는 쉘을 변경하여 사용할 수 있다.(: $ ksh testfile.sh)

이 형식은 보통 스크립트를 작성후에 디버깅하는 형식으로 사용된다.

# sh -x script.sh

# sh -xv script.sh

 

 

 

두 번째 방법

# vi testfile.sh

 

ls -l

cal

 

 

# . ./testfile.sh

-> 정상적으로 실행된다.

 

 

특성

1. read 권한만 있으면 실행된다

2. 현재 shell에서 프로그램이 실행되서 testfile.sh 안에 들어있는 shell style을 ksh 로 맞춰놔야한다. 

3. 환경파일 적용할때 많이 사용


변수 생성시 현재 shell과 자식 shell에 영향을 끼치고 부모shell에는 반영이 안된다.

. ./bashrc 현재 shell에서 실행시키는 방법, 이렇게 사용해야 현재 shell부터 자식 shell 모두에게 변수가 반영됨

 

 

 

위와 같은 방법을 통해 스크립트를 만들어서 실행 할때 특징은 다음과 같다.

일반 사용자는 읽기 권한만 있어도 실행이 된다. 하지만 root 사용자는 읽기 권한이 없어도 실행이 된다.

쉘 스크립트를 실행하는 서브쉘을 변경하여 사용할 수 없다.

이 형식은 보통 환경파일을 변경하고 현재 쉘에서 적용할려고 할때 사용한다.

 

# . ~/.profile

# . ~/.kshrc

 

 

 

 

세 번째 방법

 

# vi testfile.sh

 

ls -l

cal

 

 

# chmod 755 testfile.sh ( +X )

# ./testfile.sh

-> 정상적으로 실행한다.

파일은 동일하고 실행권한을 줘서 실행하는 방법

 

특성

1. 실행권한이 있어야 실행 가능

2. sub shell을 선택할 수 없다.

3. 현재 쓰고 있는 shell을 자동으로 sub shell로 복사해서 사용 (fork()됨)

주로 일반적인 커맨드(ls, cal 등등) 사용할때 많이 사용한다. 

새로운 shell에 환경파일 같은 경우 현재 shell과 직접상관 있어서 !()#*&)($!?????


 

 

위와 같은 방법을 통해 스크립트를 만들어서 실행 할때 특징은 다음과 같다.

스크립트에 실행 권한이 있어야만 위와 같은 형태로 실행이 된다.

쉘스크립트를 실행하는 쉘을 변경하여 사용할 수 없다.



네 번째 방법

# vi testfile.sh

 

#!/bin/bash          <= Magic Number

 

ls -l

cal

 

 

# chmod 755 testfile.sh

# ./testfile.sh

-> 정상적으로 출력된다.

 

 

특성

1. 실행권한이 있어야 동작한다.

2. 프로그램을 실행하게 되면 안에 있는 /bin/bash와 같은 sub shell로 실행된다. 

   밑에 있는 내용은 Magic Number에 적은 형식으로 작성해야한다.

 

 

위와 같은 방법을 통해 스크립트를 만들어서 실행할 때 특징은 다음과 같다.

스크립트에 실행 권한이 있어야만 위와 같은 형태로 실행이 된다.

쉘스크립트를 실행하는 쉘을 변경하여야 사용할 수 있다.

이 형식 보통 스크립트를 만드는 형식으로 사용된다.

 

 

 

 

 

쉘 스크립트들의 실행 방법을 정리하여 보면 다음과 같다.

 

 

[참고] 쉘스크립트 만드는 방법과 실행

쉘 스크립트의 실행 여부와 서브쉘의 변경 여부를 결정 짓는 것에 대한 정리표이다.

 

실행 권한 여부

서브쉘 변경 여부

첫 번째 방법

X

O

두 번째 방법

X

X

세 번째 방법

O

X

네 번째 방법

O

O

 

 

 

스크립트를 만드는 일반적인 방법은 네 번째 방법을 많이 사용하고 있다. 이 교재에서는 이 방법을 통해 스크립트를 만들고 실행한다.

 

첫 번째 행(스크립트의 시작)

 

스크립트의 첫 번째 행에서 맨 왼쪽(1)에는 스크립트를 수행할 때 사용할 쉘의 이름을 다음과 같이 적는다.

 

#!/bin/sh

#!/bin/ksh

#!/bin/csh

#!/usr/local/bin/bash

 

기호 #!매직넘버(magic number)라 불리며, 커널이 실행 프로그램으로 인식해야 하는지 여부를 알려주는 데 사용한다.

이것은 항상 스크립트의 첫행에 나와야 한다.

 

 


#!

 


#는 일반적으로 주석처리로 인식된다.

하지만 첫번째 글짜가 #으로 되있으면 두번째 글자를 보고 두번째 글자가 !이면 뒤에 있는해석기로 사용하여 아래 내용을 실행한다.

 

첫번째 행 첫번째 캐릭터가 # 인경우 두번째 캐릭터를 바라보고 두번째가 ! 일 경우 뒤에있는 해석기를 통해 아래 문서를 해석


[참고] 쉘 선택시 주의 사항

솔라리스에서 시스템 부팅시에 사용되는 쉘 스크립트는 /sbin/sh을 사용해야 한다. 부팅 과정에서 스크립트가 실행되는 시점에서는 / 파일 시스템만이 마운트 되어 있는 경우가 존재한다. 그러므로 / 파일 시스템에 존재하는 /sbin/sh만 사용이 가능하다.

 

# cat /etc/init.d/lp

#!/sbin/sh

.....

 

일반적인 스크립트는 대부분의 호환가능한 쉘을 선택하여 사용하면 된다.

 

# cat /root/bin/backup.sh

#!/bin/ksh

......

 

 

 

 

주석

 

주석(comments)은 파운드 기호(#)가 앞서 나오는 행을 말한다. 한행 전체를 차지할 수도 있고, 명령어 다음에 나올수도 있다 주석은 스크립트에 대한 명세를 설명하는데 주로 쓰인다.

 

보통 주석처리는 쉘프로그램을 만들 사람에 대한 정보나, 또는 프로그램의 기본적인 사용방법, 용도등 만든사람의 의도등이 많이 들어 가고, 쉘프로그램의 각 라인의 의미등에 대한 설명을 달기 위해서도 많이 사용된다.

 

실행문과 본 쉘의 구조

 

본쉘 프로그램은 유닉스 명령어, 본쉘 명령어, 프로그램 구조, 주석 등으로 이루어 진다.

 

 

[EX]주석 처리 예

# cat script.sh

 

#!/bin/ksh

#

# Copyright 2006 Sun Microsystems, Inc. All rights reserved.

# Use is subject to license terms.

#

# ident "@(#)script 1.9 06/01/20 SMI"

..... (중략) .....

 

# (1) Variable Definition

FILE1=/etc/passwd # Password File       =>   뒤에서 #을 써도 추석처리로 인식된다.

TMP1=/tmp/.tmp1 # Temporary File

..... (중략) .....

 

 

(Key Point)() 주석 처리 방법

 

[참고] 쉘 스크립트를 편리하게 실행하자.

스크립트의 위치를 PATH변수에 지정을 하면 시스템 커맨드를 실행하는 것과 같이 편리하게 사용할 수 있다. 예를 들어 스크립트의 위치가 /root/bin/testfile.sh 라면 다음과 같이 PATH 변수에 추가하고 적용시킨다.

 

# vi ~/.profile

 

..... (중략) .....

PATH=$PATH:/root/bin

export PATH

 

 

# . ~/.profile

# chmod 755 testfile.sh

# testfile.sh