Linux & Mac2013.06.26 15:06

Intro...



Shell Script 란?


Wikipedia에 다음과 같이 정리되어 있습니다.

셸 스크립트(shell script)는 셸이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영 체제를 위해 쓰인 스크립트이다. 단순한 도메인 고유 언어로 여기기도 한다. 셸 스크립트가 수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다.

셸 스크립트라는 말은 유닉스 셸을 위해 쓰인 스크립트를 말하는 반면, COMMAND.COM(도스)과 cmd.exe (윈도) 명령 줄 스크립트는 보통 배치 파일이라고 불리지만 이 글에는 두 개의 속성 모두를 논한다.



종류

bash, ksh, sh, csh,



Shell Script를 공부하면 좋은 점.

- C/C++ Open Source의 경우 make 파일을 제공하고 있으며 이때 만드는 makefile도 하나의 스크립트로 볼 수 있으며, makefile내에서도 위부 스크립트를 실행하는 로직이 포함되기도 합니다.


- 리눅스 계열의 OS를 공부하실때 스크립트가 많은 도움됩니다.


- 스크립트를 이용하여 자동 빌드 배포 시스템 같은 것도 만들 수 있습니다.




현재 시스템에서 사용중인 Shell 확인



Shell Script 생성

    • vi와 같은 에디터를 통해서 shell script를 작성 합니다.

    • 일반적으로 쉘 스크립트는 .sh 확장자를 사용합니다.




실행 Permission

    • Shell Script를 실행하기 위해선 실행 Permission을 부여해야 합니다.




Shell Script 실행

    • 절대 경로 혹은 상대 경로로 실행합니다.





Shell Script의 기본



쉘 스크립트 작성.


일반적으로 스크립트 첫번째 줄에 “#!bin/sh”을 넣어 줍니다.

이는 bash shell이라는 것을 명시적으로 알려주는 것이며, 생략 가능합니다.


* 주의

- 생략 가능하나 그럴 경우 시스템의 default shell이 사용됨.

- Shell 종류에 따라 command  및 사용법이 조금씩 다르므로, 명시적으로 선언하지 않을 경우 runtime 오류가 발생 가능합니다.



주석

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


* 샘플

#!/bin/bash
# 주석입니다.
clear
echo Hello World





사용자 변수

기본적으로 “변수명=값” 와 같은 형태로 작성한다.


  • 변수명에 값을 할당할 때 공백을 넣지 않는다.

  • 대소문자 구분

  • 변수명에 ? * 문자는 사용 금지


명시적 변수 선언

  1. declear 또는 typeset 명령 사용 (bash에서만 사용 가능)

  2. 옵션

    1. ‘-i’   : 정수

    2. ‘-a’   : 배열

    3. ‘-f’ : 함수

    4. ‘-r’ : 읽기 전용

    5. ‘-x’ : Shell 외부에서 사용 가능 변수


* 샘플

#!/bin/bash
test=testValue1
test2=$test
test3=testValue3
echo
test=$test
echo
test2=$test2
echo
test3=$test3

#변수명과 텍스트를 붙여쓰고 싶은 경우

echo “텍스트"$변수명"텍스트




시스템 변수

변수명

설명

BASH

쉘 이름

BASH_VERSION

쉘 버젼

COLUMNS

컬럼

LINES

라인

HOME

홈 디렉토리

LOGNAME

로그인 명

OSTYPE

OS 타입

PATH

패스 설정 값

PS1

prompt 설정 값

PWD

working 디렉토리

SHELL

쉘 이름

USERNAME

현재 로그인된 유저 ID




특수 문자

변수

의미

$?

마지막으로 실행된 명령어가 돌려주는 최종 값 (0이면 성공, 그렇지 않으면 실패)

$$

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

$!

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

$-

Shell로 넘겨진 flag

$_

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

$#

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

$*

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

$@

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

$0

Shell의 이름

$1, $2, …$n

매개변수



ex1) 외부 프로세스 실행 후 결과 확인



ex2)




이스케이프(escape) 문자

- \와 하나의 문자로 구성. 화면에 표시되지 않고 특수한 의미를 지님.


변수

의미

\a

경고음

\b

백 스페이스

\n

개행

\t

수평 탭

\v

수직 탭

\\

‘\’ 문자 표시

\?

‘?’ 문자

\’

작은 따움표(‘)

\”

큰 따움표 (“)





Shell Scrip 명령문.



echo 커멘드 옵션

echo [옵션] [텍스트, 변수 등]


옵션

  1. -n 출력 후 줄바꿈 안함.

  2. -e 다음과 같은 문자를 텍스트에서 사용 가능하게 한다.





연산 (계산식)

expr 값1 연산자 값2

해당 공식을 계산해서 화면에 출력한다.




quote 출력 규칙

\, $ 문법 사용이 가능

\, $ 문법을 무시하고 그대로 출력

`

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



ex) quote test




입력값 받기

read 변수

사용자로부터 입력값을 받는 명령어 이다.


ex)





매개변수

함수를 호출할 때나, 쉘 스크립트 파일을 실행할 때 뒤에 띄어쓰기로 구분하여 매개 변수를 전달 할 수 있습니다.


예제

설명

$0

쉘 스크립트 이름

$#

매개 변수의 개수

$*

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

$1 ~ $n

매개 변수



ex) ./test_parameter.sh 123 computer 실행시




결과 :



변수 내용 조작하기

예제

설명

${variable:-default}

변수가 존재하지 않으면 default로 대체

${#variable}

variable의 length를 얻는다.

${variable%word}

variable의 끝에서부터 word와 첫번째로 일치하는 부분을 제거한다.

${variable%%word}

variable의 끝에서부터 word와 마지막으로 일치하는 부분을 제거한다.

${variable#word}

variable의 시작에서부터 word와 첫번째로 일치하는 부분을 제거한다.

${variable##word}

variable의 시작에서부터 word와 마지막으로 일치하는 부분을 제거한다.

word에는 와일드카드(*)를 사용할 수 있습니다.


ex)




배열






Shell Script 종료

exit 반환값


exit 명령을 만나면 수행중인 shell script를 종료합니다.

반환 값이 0이면 성공적으로 shell script를 종료한 것이며, 그렇지 않으면 실패한 것입니다.




Shell Script 제어문



비교 연산

    • 산술 비교 조건



    • 문자열 비교 조건



    • 파일 비교 조건



    • AND, OR 조건
      AND, OR 조건은 다음과 같은 형태로 사용 가능합니다.





if 문




case 문





for 문






while 문







Functions

쉘 스크립트에서는 다음과 같이 함수를 만들어 사용할 수 있습니다.











주요 Command...



자주 사용되는 몇 가지 명령들에 대하여 간략히 설명드립니다.

자세히 알고 싶은 경우 man 명령을 통해서 살펴보시기 바랍니다.



grep 명령

정규 표현식에 매치하는 문자열을 찾아서 해당 행만을 출력.


문법

grep [옵션] <찾을 문자열 정규 표현식> [대상 파일명]


옵션

  • ‘-i’ : 소문자와 대문자를 구분하지 않고 검색

  • ‘-c’ : 매치하는 행 수만을 리턴

  • ‘-w’ : 단어 단위로 패턴을 검색

  • ‘-v’ : 검색 패턴에 매치하는 내용이 없는 행만 리턴

  • ‘-n’ : 라인 번호를 붙여서 리턴



ex)

# grep -n '^jack:' /etc/passwd

(/etc/passwd 파일에서 jack을 찾는다. jack이 행의 맨 앞에 있으면 행 번호를 화면으로 출력한다.)



종료 상태 :

grep은 파일 검색의 성공 여부를 종료 상태값으로 되돌려준다.

패턴을 찾으면 0, 패턴을 찾을 수 없으면 1, 팡리이 존재하지 않을 경우 2


출처 : http://korcow.egloos.com/1854945




awk 명령

열 단위로 정리되어 있는 텍스트 파일에서 데이터를 뽑아낼 때 사용.


문법

awk <pattern> { action }


  • -F
    필드 구분자 이다.



  • Action

액션은 문장(statements)으로 이루어져 있다. 액션은 간단하게 상수 하나로 이루어질 수도 있고, 개행 문자나 세미콜론(;)에 의해 분리된 몇 개의 문장의 연속으로 구성될 수도 있다.


print : 특정 규칙에 맞게 데이터를 화면에 출력한다.

$1, $2 … $n : 필드 번호

$NF : 마지막 필드



예제

awk -F ':' '{ print $1 }' filename // 입력 필드를 ':'로 구별

awk -F "[ :]" '{ print $1 $2 }' filename // 스페이스와 ':'로 입력 필드 구별

awk ‘/aaa/’ filename // aaa라는 단어가 있는 라인 출력

awk ‘^aaa/’ filename // aaa로 시작하는 라인 출력

awk ‘/^(aa | bb)/’ filename // aa 또는 bb로 시작하는 라인 출력



참고 : http://www.dreamy.pe.kr/zbxe/CodeClip/6332




cut 명령

텍스트 또는 문장에서 하나 이상의 부분을 제거.


문법

cut [옵션] [파일]



옵션

  • -c : 지정한 컬럼 출력

  • -f : 지정한 필드 출력

  • -d : 구분자(delimiter). -f 옵션과 함께 사용.



예제

root@ls ]# cut -c 2-5 /etc/passwd

/etc/passwd 파일의 2번째부터 5번째 문자까지를 출력한다


[root@ls ]# cut -f 3 anaconda-ks.cfg

anaconda-ks.cfg 파일의 3번째 필드를 출력한다. 필드 구분은 tab이다.


[root@ls ]# cut -f 2 -d : /etc/passwd

/etc/passwd 파일의 2번째 필드를 출력한다. 필드 구분은 ‘:’이다.




sed 명령

비 대화모드의 라인 단위 편집기



문법

sed [옵션] [sed 명령어] [파일]



  • 치환 (substitute) : 원본 파일을 바꾸지 않고 출력을 바꿔서 한다.
    sed ‘
    s/대상 정규식 패턴/바꿀 문자열' filename : 제일 처음 나오는 것을 switch
    sed ‘
    s/대상 정규식 패턴/바꿀 문자열/g' filename : 모든(global)에서 switch

ex 1)  filename에서 제일 처음 나오는 aaa를 bbb로 치환

sed ‘s/aaa/bbb’ filename


ex 2) filename에서 모든 aaa를 bbb로 치환.

sed ‘s/aaa/bbb/g’ filename


  • 찾기, 출력
    sed
    -n ‘/정규식 패턴/p’ filename


-n : 읽은 것을 출력하지 않음

/p : 해당 라인을 출력



  • 삭제
    sed '/TD
    /d' 1.html : TD 문자가 포함된 줄을 삭제하여 출력한다.

sed '/Src/!d' 1.html : Src 문자가 있는 줄만 지우지 않는다.

sed '1,2d' 1.html : 처음 1줄, 2줄을 지운다.

sed '/^$/d 1.html : 공백라인을 삭제하는 명령이다



참고 :

shell script  정리 : http://www.insford.com/wiki/Wiki.jsp?page=Shell%20Script




저작자 표시 동일 조건 변경 허락
신고

'Linux & Mac' 카테고리의 다른 글

[Script] Android Auto Build Script  (0) 2013.07.15
FTP 자동 배포 스크립트  (0) 2013.06.28
Bash Shell Script  (10) 2013.06.26
[Git] Upgrading Git on Mac OS X Lion  (0) 2013.05.27
[Linux] Permission  (1) 2013.03.04
Posted by 발~ 발이