본문 바로가기

IT/OS|Network|Script

[bash] Shell TIPS

728x90

원글(이글루): 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

728x90