'SCRIPT'에 해당되는 글 1건

  1. 2013.05.27 Bash Shell Script
프로그램 언어/Shell2013. 5. 27. 16:39

Shell Script

 

 

우선 Shell 이란 운영체제에서 제공하는 명령을 실행하는 프로그램이며 운영체제의 관리하에 있는 파일, 프린팅, 하드웨어 장치,

그리고 애플리케이션과의 인터페이스를 제공합니다. 즉, 운영체제에서 제공하는 각 명령들을 쉘 인터페이스에서 실행하면

운영체제(OS)가 그 명령에 해당하는 일을 수행합니다.

 

따라서 Shell Script 란 리눅스 시스템에서 지원하는 명령어들의 집합을 묶어서 프로그램화 한것을 뜻한다고 생각하면 됩니다.

 

- 출처 : 김택용의 리눅스 쉘 스크립팅

 

 

Shell Script 에는 여러 종류가 있습니다.

예) bash, ksh, sh, csh 등등..

 

Shell Script 로 할수 있는 일은 무궁무진 하며, 그중 Bash 에 대하여 기초가 되고 가장 기본적인 사항들을 정리해보고자 합니다.

 

일반적으로 Shell Script 는 .sh 확장자를 사용하며, Putty 나 SecurCRT 같은 프로그램으로 리눅스 시스템에 접근하여

vi(또는 vim) 같은 에디터를 통해 작성합니다.

 

우선 자신의 시스템이 어떤 Shell 을 사용중인지 확인합니다. (CentOS 5.6 기준)

 

[root@b ~]#
[root@b ~]# echo $SHELL
⁄bin⁄bash
[root@b ~]#
[root@b ~]#

 

실행을 위해서는 리눅스 시스템에 로그인한 유저(또는 실행할 유저) 실행 권한을 부여해야 합니다.

(chmod 명령어를 이용합니다.)

[root@b ~]# chmod 701 iptables.sh
[root@b ~]# ls -al iptables.sh
-rwx-----x 1 root root 176 Oct 14 18:10 iptables.sh
[root@b ~]# .⁄iptables.sh

 

 

 

 

 

 

 

Shell Script 작성

 

첫번째 라인에 #/bin/sh(또는 #/bin/bash) 를 입력합니다.

이는 이 파일이 Bash Shell Script 라는것을 알려주는것이며, 생략이 가능하나 실행시 아래처럼 실행을 해야 합니다.

 

[root@b ~]#
[root@b ~]# ⁄bin⁄sh iptables.sh
[root@b ~]#

 

 

/bin/sh 없이 바로 실행할 경우 시스템의 기본 Shell 로 실행이 됩니다.

(Shell 에 따라 일부 명령에 대하여 사용법이 약간 틀리므로 주의가 필요합니다.)

 

 

 

 

 

 

 

 

 

 

 

 

Shell Script 변수

 

변수에는 사용자가 설정하는 변수 와 시스템에서 명시되어 있는 변수가 있습니다.

 

- 사용자 변수 설정시 주의사항

: # 로 시작하는 라인은 주석으로 인식합니다.

: 변수는 변수명=값 의 형태로 작성합니다.

: 변수명에 값을 설정할때 공백을 넣지 않습니다.(예: TODAY = 'date +%H'     <- 오류발상)

: 변수명은 대소문자를 구분합니다.

: 변수명에 ? * 문자는 사용할 수 없습니다.

: 리눅스 명령어 실행 결과를 변수에 넣을때는 `(~ 문자)로 감싸줘야 합니다.(예: DATE=`date +%H%s`)

 

 

 

시스템 변수는 아래를 참고하시면 됩니다.

(시스템 변수에 다른 내용을 넣을 수는 있지만, 로그아웃 하여 해당 Shell 나가기전엔 그대로 적용되어 시스템에 영향을 줄 수 있으니 주의가 필요합니다.)

 

변수

설명

변수

설명

$BASH

Shell 이름

$?

마지막으로 실행된 명령어의 Return 값 ( 0 이면 성공, 1~255는 실패)

$BASH_VERSION

Shell 버젼

$$

현재 수행 중인 프로세스의 프로세스 ID

$COLUMNS

컬럼

$!

Shell 이 수행시킨 마지막 백그라운드 프로세스의 ID

$LINES

라인

$-

Shell 로 넘겨진 flag

$HOME

홈디렉토리

$_

Shell 이 가동될 때 Shell에 전달된 flag 또는 set 명령을 사용해 지정된 flag

$LOGNAME

로그인명

$#

Shell 이 입력받은 전체 매개변수의 개수

$OSTYPE

OS타입

$*

한 낱말로 표시되는 전체 위치 매개변수들

$PATH

패스설정값

$@

$*과 동일하지만 각 매개변수는 quote되어 문자열로 취급됨

$PS1

Prompt설정값

$0

Shell 의 이름

$PWD

현재 디렉토리

$1, $2, …$n

매개변수

$SHELL

Shell 이름

   

$USERNAME

현재 로그인한 유저명

 

 

 

 

 

아래는 이스케이프 문자로 \와 하나의 문자로 구성되며, 각각 특수한 의미를 가지고 있습니다.

 

변수

설명

변수

설명

\a

경고음

\b

백 스페이스

\n

개행, 줄바꿈

\t

수평 탭

\v

수직 탭

 

 

 

 

 

시스템 변수 중 매개변수가 있습니다. 매개변수는 함수를 호출하거나 Shell Script를 실행할때 뒤에 구분하여 매개 변수를 전달 합니다.

(예를 들면 대표적인 /etc/init.d/crond start 와 같이 뒤에 start 라는 매개변수를 전달하여 서비스를 실행하는것과 같습니다. crond 는 잘 짜여진 Shell Script 입니다.)

 

변수

설명

$0

실행한 쉘 스크립트 이름

$#

입력한 매개 변수의 개수

$*

입력한 매개 변수들을 모아놓은 문자열

$1 ~ $n

매개 변수

 

#!⁄bin⁄sh

echo $0    # test.sh
echo $#    # 5
echo $*    # 내 ID는 pyd0927 입니다 .
echo $1    # 내
echo $3    # pyd0927

[root@b ~]# .⁄test.sh 내 ID는 pyd0927 입니다 .
.⁄test.sh
5
내 ID는 pyd0927 입니다 .
내
pyd0927
[root@b ~]#

 

 

Bash Shell 에서는 변수 내용을 편집할 수 있습니다.

아래의 표와 같이 사용되며, word 부분에 * (와일드카드)를 사용할 수 있습니다.

 

사용 예제

설명

${변수명:-default}

변수가 존재하지 않으면 default로 대체합니다.

${#변수명}

변수의 length(길이)를 구합니다.

${변수명%word}

변수의 끝에서부터 word와 첫번째로 일치하는 부분을 제외합니다.

${변수명%%word}

변수의 끝에서부터 word와 마지막으로 일치하는 부분을 제외합니다.

${변수명#word}

변수의 시작에서부터 word와 첫번째로 일치하는 부분을 제외합니다.

${변수명e##word}

변수의 시작에서부터 word와 마지막으로 일치하는 부분을 제외합니다.

 

#!⁄bin⁄sh

id="pyyd0927"
echo ${id:-default}    # pyyd0927
echo ${idd:-default}   # default - idd변수가 없어서 default가 출력된다.
echo ${#id}            # 8
echo ${id%y*}          # py
echo ${id%%y*}         # p
echo ${id#*y}          # yd0927
echo ${id##*y}         # d0927

[root@b ~]# .⁄test.sh
pyyd0927
default
8
py
p
yd0927
d0927
[root@b ~]#

 

 

 

 

 

 

 

 

 

 

 

 

 

Shell Script 명령문 작성

 

Shell Script 명령문 작성시 알아두면 좋은 혹은 꼭 알아야할 몇가지가 있습니다.

 

echo 명령어

echo 명령어는 echo [옵션]] [텍스트, 변수 등]] 로 사용하며, 텍스트 또는 변수를 출력해 줍니다.

옵션으로는 -n 과 -e 가 있으며, -n 은 출력 후 라인 줄바꿈을 하지 않을때 사용하고, -e 는 이스케이프 문자를 이용하여 변수나 텍스트를 출력할때 사용합니다.

※ echo 명령어로 변수와 텍스트를 붙여서 출력하기 위해서는 echo $변수명"텍스트"$변수명"텍스트" 형식으로 하면 됩니다.

 -e 옵션에 사용하는 이스케이프 문자

 

       \0NNN  the character whose ASCII code is NNN (octal)

       \\     backslash

       \a     alert (BEL)

       \b     backspace

       \c     suppress trailing newline

       \f     form feed

       \n     new line

       \r     carriage return

       \t     horizontal tab

       \v     vertical tab

 

연산, 계산식 사용(expr)

expr 명령어를 사용하여 Shell Script 에서 연산, 계산식을 사용할 수 있습니다.

 

#!⁄bin⁄sh

expr 1 + 1
expr 5 - 2
expr 20 ⁄ 5
expr 20 % 4
expr 10 \* 3
echo `expr 11 + 3`

[root@b ~]# .⁄test.sh
2
3
4
0
30
14
[root@b ~]#

 

 

quote 사용 규칙

" : \, $ 문법이 사용 가능합니다.

' : \, $ 문법을 무시하고 그대로 출력합니다.

` : `안에있는 커맨드를 실행하여 출력합니다.

 

#!⁄bin⁄sh

id=pyd0927
echo "my ID : $id" # my ID : pyd0927 출력
echo 'my ID : $id' # my ID : $id 출력
echo 'expr 5 + 15' # expr 5 + 15 출력
echo `expr 5 + 15` # 20 출력

 

 

read 명령어

입력값을 받는 명령어 입니다.  read 변수명 으로 사용합니다. (예: read 변수명)

 

#!⁄bin⁄sh

read ID

echo "ID : $ID"

[root@b ~]# .⁄test.sh
pyd0927
ID : pyd0927
[root@b ~]#

 

 

 

 

 

 

 

 

 

 

Shell Script 비교 연산자

 

아래는 Shell Script 조건문 에서 사용되는 비교 연산자 입니다. (보통 if 문이나 while 문에서 주로 사용합니다.)

 

- 문자열 비교 연산자

설명

[ string ]

빈문자열이 아니면 true

[ string1 = string2 ]

문자열이 같으면 true

[ string1 != string2 ]

문자열이 다르면 true

[ -n string ]

문자열이 null이 아니면 true

[ -z string ]

문자열이 null이면 true

 

- 산술 비교 연산자

설명

[ expr1 -eq expr2 ]

두 표현식이 같으면 true

[ expr1 -ne expr2 ]

두 표현식이 같지 않으면 true

[ expr1 -gt expr2 ]

expr1 > expr2 이면 true

[ expr1 -ge expr2 ]

expr1 >= expr2 이면 true

[ expr1 -lt expr2 ]

expr1 < expr2 이면 true

[ expr1 -le expr2 ]

expr1 <= expr2 이면 true

[ ! expr ]

true이면 false, false이면 true

[ expr1 -a expr2 ]

expr1 AND expr2 의 결과

[ expr1 -o expr2 ]

expr1 OR expr2 의 결과

 

- 파일 비교 연산자

설명

[ -b FILE ]

FILE 이 블럭 디바이스이면 true

[ -c FILE ]

FILE 이 문자 디바이스이면 true

[ -d FILE ]

FILE 이 디렉토리이면 true

[ -e FILE ]

FILE 이 존재하면 true

[ -f FILE ]

FILE 이 존재하고 정규파일이면 true

[ -g FILE ]

FILE 이 set-group-id 파일이면 true

[ -h FILE ]

FILE 이 심볼릭 링크이면 true

[ -L FILE ]

FILE 이 심볼릭 링크이면 true

[ -k FILE ]

FILE 이 Sticky bit 가 셋팅되어 있으면 true

[ -p FILE ]

True if file is a named pipe.

[ -r FILE ]

현재 사용자가 읽을 수 있는 파일이면 true

[ -s FILE ]

파일이 비어있지 않으면 true

[ -S FILE ]

소켓 디바이스이면 true

[ -t FD ]

FD 가 열려진 터미널이면 true

[ -u FILE ]

FILE 이 set-user-id 파일이면 true

[ -w FILE ]

현재 사용자가 쓸 수 있는 파일(writable file) 이면 true

[ -x FILE ]

현재사용자가 실행할 수 있는 파일(Executable file) 이면 true

[ -O FILE ]

FILE 의 소유자가 현재 사용자이면 true

[ -G FILE ]

FILE 의 그룹이 현재 사용자의 그룹과 같으면 true

[ FILE1 -nt FILE2 ]

FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) true

[ FILE1 -ot FILE2 ]

FILE1이 FILE2 보다 오래된 파일이면 true

[ FILE1 -ef FILE2 ]

FILE1 이 FILE2의 하드링크 파일이면 true

 

 

- AND, OR

AND 조건

예제

&&

[ "$ID" = "pyd0927" ] && [ "$ID" = "pyd"]

OR 조건

예제

||

[ "$ID" = "pyd0927" ] || [ "$ID" = "pyd"]

 

 

 

 

 

 

 

 

 

Shell Script 조건문

 

Shell Script 조건문에는 여러가지가 있으며, IF, FOR, WHILE, CASE 가 가장 많이 쓰입니다.

 

- IF 문

#!⁄bin⁄sh
if [ 조건식 ] then
   echo "참"  #조건식이 참일때
else
   echo "거짓" #조건식이 거짓일때
fi
#



# if - elseif 문
if [ 조건식1 ] then
    echo "참" #조건1 이 참일때
elif [ 조건식2 ]
    echo "조건식 1 : 거짓, 조건식 2 : 참" #조건식1이 거짓이고, 조건식2가 참일때
else
    echo "모두 거짓" #조건식1, 2가 거지일때
fi


 

- FOR 문

#!⁄bin⁄sh

list="a b c d"
for i in $list do  # list변수에 있는 내용을 띄어쓰기로 구분
    echo $i     # a, b, c, d 가 출력되고 for 문은 종료
done


# 다음처럼 리스트에 명령어 결과를 이용 할 수 있습니다.
for dir in `ls -a`do
    echo $dir
done



# for ((초기값;조건식;증감)) 으로 사용할 수 있습니다.
array=(a b c d)

for ((i=0;i<=3;i++)) do
        echo "${array[$i]}"
done

 

 

- WHILE 문

#!⁄bin⁄sh

i=1
while [ $i -lt 5 ] #  i < 5 이면
do
        echo $i
        i=`expr $i + 1` # i = i + 1
done

 

 

- CASE 문

#!⁄bin⁄sh

read ID

case $ID in
        "pyd0927")      # read 로 입력받은 ID 값이 pyd0927 일때
                echo "ID : pyd0927"
        ;;
        "pyd")          # read 로 입력받은 ID 값이 pyd 일때
                echo "ID : pyd"
        ;;
        *)              # 일치하는 값이 없을때 출력될 기본값
                echo "ID : None"
        ;;
esac

[root@b ~]# .⁄test.sh
pyd0927
ID : pyd0927
[root@b ~]# .⁄test.sh

ID : None
[root@b ~]# .⁄test.sh
pyd
ID : pyd
[root@b ~]#

 

 

Shell Script 디버깅

 

작성한 Shell Script 실행시 오류가 발생하거나 의도한대로 결과값이 출력되지 않을때 , 즉 문제점을 찾기위하여 디버깅옵션(-x)을 사용할 수 있습니다.

예를들면 /bin/sh -x test.sh 처럼 실행을 하면 실행되면서 각 변수에 할당된 값이 출력이 되고 중간에 오류가 발생한 경우에는

오류 발생하기 전까지의 실행 결과를 확인할 수 있으므로, 오류나 잘못된 부분을 찾기에 좋습니다.

 

[root@b ~]# ⁄bin⁄sh -x test.sh
+ read ID
pyd0927
+ case $ID in
+ echo 'ID : pyd0927'
ID : pyd0927
[root@b ~]#

 

 

 

Posted by 소울하트