[bash] Shell TIPS

원글(이글루): 2009-12-29 20:22:54

발췌 : http://www.4offline.org/maincontent.htm

쉘은 유닉스의 심장부인 커널과 사용자간의 인터페이스를 제공한다.
쉘은 입력되는 명령어를 해석하고 파일과 변수의 대치, 입출력 리다이렉션, 실행 파일의 준비,
인터페이스 프로그램의 초기화를 수행한다.
쉘은 자식 프로세스를 생성하여 그 실행을 관리할 수 있으며, 사용자의 환경변수를 보존한다.
또한 쉘은 강력한 프로그래밍 언어이기도 하다.

—————————————————————————————–
Bounrne 쉘

기초
        쉘의 기동
        환경
        옵션
        특수문자
변수
        사용자 정의 변수
        환경변수
        위치변수 혹은 쉘 인자
Shell Script Programming
        조건 테스트
        반복과 루프제어
쉘과 친해지기

—————————————————————————————–
Shell 기초

        쉘의 기동

        Shell을 가동하거나 실행할때, 사용 가능한 옵션이 있다.
        Shell Script의 문법을 검사할때, -n 옵션을 사용하면 실행하지는 않고 Script를 판독한다.
        디버깅하는 중이라면, -x 옵션을 사용하여 Trace 모드를 설정할 수 있다.

        다음은 대부분의 유닉스에서 사용가능한 Bourne Shell의 옵션이다.
        -a                                        익스포트할 모든 변수표시
        -c “string”        string으로부터 명령어판독
        -e                                 비대화형모드설정
        -f                                        쉘파일명 생성을 불가상태로 설정
        -h                                        정의된 대로 함수를 위치시키고 기억해둠
        -i                                        대화형 모드
        -k                                        명령에 대한 인자를 환경에 삽입
        -n                                        명령어를 판독, 실행하지는 않음.
        -r                                        제한모드 설정
        -s                                        표준입력으로 명령어 입력받음
        -t                                        한 명령을 수행하고, 쉘을 마침
        -u                                        치환도중 설정되지 않은 변수에 대하여 에러발생
        -v                                        다변모드 설정, 쉘 입력행을 표시
        -x                                        추적모드 설정, 명령어의 실행 모습을 표시

        환경

        사용자의 홈디렉토리에 .profile 파일이 있다.
        여기서 시스템 관리자나 사용자는 언제든지 자신의 쉘 환경을 변경할 수 있다.
        실행파일 경로에 디렉토리를 추가할면 .profile에 다음을 덧붙이면 된다.
        PATH=$PATH:/sql/bin; export PATH
        적용하기 위해서는 로그인을 다시하거나
        source .profile 해주어야한다.

        특수문자
        쉘에 의해 자동적으로 설정하여 특별한 쉘 변수를 나타내는 특수 문자들이 있다.
        모든 변수들과 마찬가지로 그 문자들 역시 $가 앞에 붙는다.

        $#                        명령 쉘에 주어진 인자의 수
        $-                                쉘의 명령어에 의해 설정되는 플래그
        $?                                마지막 명령어 수행 결과에 의한 상태값
        $$                        현재 쉘의 프로세스 번호
        $!                                마지막 자식 프로세스의 프로세스번호
        $@                        모든 인자, 각각은 큰 따옴표 처리된다.
        $*                                모든인자, 전체가 큰 따옴표 처리된다.
        $n                        ‘n’이 위치한 곳의 위치 인자값
        $0                                현재 쉘의 이름

—————————————————————————————–        
변수
        사용자 정의 변수
        대부분의 유닉스 명령어는 소문자이므로 쉘 프로그래밍에서는 변수명을 대문자로 만드는 것이 상례이다.
        그러나 꼭 대문자를 써야하는 것은 아니지만, 그렇게 함으로 프로그램에서 변수를 확인하기가 쉬워진다.
        [root@www backhome]# COUNT=1
        [root@www backhome]# NAME=Saridong
        [root@www backhome]# echo $COUNT
        1
        [root@www backhome]# echo $NAME
        Saridong

        Default 값 치환
        ${variable:-value}
                변수의 값이 설정되지 않은 경우에 변수를 설정한 값으로 치환한다. 위의 예에서 보자.
                [root@www backhome]# echo ${name:-HHH}
                HHH

        할당
        ${variable:=value}

        치환할 변수가 설정된 경우에만
        ${variable:+value}

—————————————————————————————–        
Shell Script Programming
        쉘 프로그램에서 사용자가 할 수 있는 것은 결국 여러 명령어들을 하나의 명령어로 만들어 실행하는 것이다.
        일반 프로그래밍 언어와 마찬가지로, 쉘은 사용자가 보다 유용한 프로그램을 만들 수 있게 하는 특성들을 가지고 있다.
        데이터변수, 인자전달, 의사결정, 흐름제어, 데이터 입출력, 서브루틴과 인터럽트 조작 등이 그것이다.

        이러한 특성을 이용하여, 모든 컴퓨터 언어가 목적하는 바처럼, 반복 작업을 자동화 할 수 있다.
        본 강의에서는 사용자 계정의 풀백업을 하는 것으로 예를 들며 마친다. 물론 기본적인 예들도 함께..

        어찌해서 쉘스크립트를 짯다고 하자, 만약에 아직 짜본적이 없다하더라도 그냥 보자.
        어떻게 실행할까?
        1. bash script-name
                script-name이라는 스크립트를 bash야 실행해라
        2. chmod +x script-name
                chmod로 실행가능하게 해준다

        주석은 # 로한다. 한 라인이 주석이된다.
                # 요렇게 쓰면 된다 이기야.

        산술처리
        expr intger operator integer

        +                두 정수를 더한다.
        –                두번째 정수에서 첫번째 정수를 뺀다.
        *                두 정수를 곱한다.
        /                첫번째 정수를 두번째 정수로 나눈다.
        %                나머지를 하고 남은 수

        [root@www backhome]# expr 2 + 1
        3
        [root@www backhome]# expr 2+1                                        #주의하장. 빈칸이 있어야한다.
        2+1

        주의) 곱셈을 위해서는
        [root@www backhome]# expr 4 \* 10                        #이와 같이 escape처리해야한다 why *는 모든 것으로 치환되려한다.
        40

        문자형 데이터검사
                str1=str2                str1과 str2가 같은 길이, 같은 문자로 구성되어 있으면 참
                str1!=str2                str1과 str2가 다르면 참
                -n str1                         str1의 길이가 0보다 크면(널이 아니면) 참
                -z str1                         str1이 널(길이가 0)이면 참
                str1                                str1이 널이 아니면 참

        숫자형 데이터검사
                int1 -eq int2                int1과 int2가 같으면 참
                int1 -ne int2                int1과 int2가 다르면 참
                int1 -gt int2                int1이 int2보다 크면 참
                int1 -ge int2                int1이 int2보다 크거나 같으면 참
                int1 -lt int2                int1이 int2보다 작으면 참
                int1 -le int2                int1이 int2보다 작거나 같으면 참
                주의) 모두 정수형이다.

        파일검사
                -r filename                사용자에게 읽기권한이 있을 경우 참
                -w filename                사용자에게 쓰기권한이 있을 경우 참
                -x filename                사용자에게 실행권한이 있을 경우 참
                -f filename                filename이 보통파일인 경우 참
                -d filename                filename이 디렉토리인 경우 참
                -c filename                filename이 character special 파일인 경우 참
                -b filename                filename이 block special 파일인 경우 참
                -s filename                filename의 크기가 0이 아닌 경우참
                -t filename                파일 기술자인 fnumb(default 1)와 관련된 장치가 터미널이면 참


        조건 테스트
                —————–
                if command1
                then
                        command2
                        command3
                fi
                —————–
                if command1
                then
                        command2
                        command3
                else
                        command4
                fi
                —————–
                if command1
                then
                        command2
                        command3
                elif command4
                then
                        command5
                fi
                —————–
                case value in
                        pattern1)
                                command
                                command;;
                        pattern2)
                                command
                                command;;
                        …
                        patternn)
                                command
                                command;;
                esac


        사용자 입력받기
        read var1 var2 var3 var4 … varn


        반복과 루프제어
                —————–
                while command
                do
                        command
                        command
                        …
                        command
                done
                —————–
                for variable in arg1 arg2… argn
                do
                        command
                        command
                        …
                        command
                done

                주의)loop벗어나기 continue, break

        함수사용
        고급 프로그래밍 언어의 일반적인 특성으로, 컴퓨터 명령어들을 그룹화함으로써 프로그램 내의 어느 곳에서나
        호출하여 사용할 수 있게 하는 것이 함수이다. 이러한 함수들을 서브루틴이라고도 한다.
        예)
                # Start Program

                selection(){
                        while true
                        do
                                echo “Continue? (y/n) \c”
                                read ANSWER
                                case $ANSWER in
                                        [Yy] ) return 0;;
                                        [Nn] ) return 1;;
                                        * ) echo “Answer y or n”;;
                                esac
                        done
                }

                setup(){
                        echo “called setup function”
                }

                if selection
                then
                        setup
                        echo “Ok”
                fi

        주의) 먼저 정의하고 사용하라

—————————————————————————————–
쉘과 친해지기
몇가지 예로써 마친다.

예1)@@@@@@@@@@@@@@@@@@@@@@@@@@
# Start Program

selection(){
        while true
        do
                echo “Continue? (y/n) \c”
                read ANSWER
                case $ANSWER in
                        [Yy] ) return 0;;
                        [Nn] ) return 1;;
                        * ) echo “Answer y or n”;;
                esac
        done
}

setup(){
        echo “called setup function”
}

if selection
then
        setup
        echo “Ok”
fi

예2)@@@@@@@@@@@@@@@@@@@@@@@@@@
# squares – prints the square of integers in succession

echo “squares – prints the square of integers in succession”

int=1
while [ $int -lt 5 ]
do
        sq=`expr $int \* $int`
        echo $sq
        int=`expr $int + 1`
done
echo “Job Complete”

예3)@@@@@@@@@@@@@@@@@@@@@@@@@@
# Interactive program to testing control statement

echo “음하하..제어문을 전부다 알아보도록하자”

while true
do

        # Display Menu
        echo
        echo “Make a choice from the Menu below”
        echo
        echo “1 Restore Archive”
        echo “2 Backup Archive”
        echo “3 Unload Archive”
        echo “4 Quit”
        echo

        #Read the user’s selection
        echo “몇벌할라우? : \c”

        read CHOICE

        case $CHOICE in
                [1-3] ) echo
                                        # 디렉토리 경로를 읽어들이고, 디렉토리가 맞는지 체크한다.
                                        echo “어떤 디렉토리를 할라우? \c”
                                        read WORKDIR

                                        if [ ! -d “$WORKDIR” ]
                                        then
                                                echo “디렉토리 입력하라니께”
                                                continue
                                        fi

                                        # 디렉토리 제대로 입력했군. 그쪽으로 가장.
                                        cd $WORKDIR;;
                4) : ;;
                * ) echo “Sorry, $CHOICE is not a valid choice”
                        continue
        esac

        case “$CHOICE” in
                1) echo “1번을 선택했군 “;;
                2) echo “2번을 선택했군 “;;
                3) echo “3번을 선택했군 “;;
                4) echo “4번을 선택했군 끝냅니다”
                        break;;
        esac

        # 명령이 제대로 실행되었는지 체크한다. 여기서야 당연히 무조건 참이지만..
        if [ $? -ne 0 ]
        then
                echo “프로그램에 문제가 있구만..”
                if [ $CHOICE =3 ]
                then
                        echo ” 디렉토리가 지워지지 않는다”
                fi
                echo “체크해보우”
                continue
        else
                if [ $CHOICE = 3 ]
                then
                        echo “모든 것이 오케이다”
                fi
        fi
done

예4)@@@@@@@@@@@@@@@@@@@@@@@@@@
#!/bin/bash
# 작성자 : 이상동
# 작성일 : 2002-11-06 10:45오전
# 기   능 : BASE_DIR로 되어있는 전체디렉토리를 백업합니다.
# 생각해볼일 : argument로 변수를 넘겨주어서 임의의 디렉을 백업할 수 있습니다.

# 수정자 :
# 수정이유 :

# 백업할 디렉토리
BASE_DIR=/home

# 저장할 위치
BACKUP_LOCATION=/data/backhome/

LIST=`ls $BASE_DIR|sort -nr`

cd $BASE_DIR

for ACCOUNT in $LIST
do        
        # 디렉토리가 아닌 경우에는 백업하지 않는다.
        # 이번 스크립트는 홈을 백업하는 것이라, 파일은 제거하였다.
        # 디렉토리의 모든 내용을 백업할 생각이시면 아래부분을 없애버리시면 됩니다.
        if [ ! -d $ACCOUNT ]
        then
                continue
        fi
        tar cvfpz ${BACKUP_LOCATION}${ACCOUNT}.tgz $ACCOUNT
done

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다