본문 바로가기

Learning/└◆Shell Scripts

쉘 스크립트 작성 가이드

 

쉘 스크립트란?

 

쉘 스크립트(shell script)는 쉘이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영 체제를 위해 쓰인 스크립트

단순 도메인 고유 언어로 여기기도 한다. 쉘 스크립트가 수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다. 쉘 스크립트라는 말은 유닉스 쉘을 위해 쓰인 스크립트를 말하는 반면, COMMAND.COM(도스)과 CMD.exe(윈도우)명령 줄 스크립트는 보통 배치 파일이라고 불리지만 이 글에는 두 개의 속성 모두를 논한다.

 

스크립트를 작성하기 전 중요하게 생각해야 할 것은 스크립트 이름이다.

이름만으로도 기능을 알 수 있게 만들면 나중에 스크립트를 여러개 만들어도 관리가 쉬워지기 때문

 

스크립트의 이름은 기본적으로 test.sh처럼 뒤에 확장자명을 .sh로 하여야 한다

확장자 명을 기록하는 이유는 해당 스크립트가 어떤 언어로 작성되어 있는지 알기 위함

EX) test.sh (bash script), test.pl (perl script), test.exp (expect script) 등

 

 

쉘 스크립트 시작하기

 

1. vi 에디터로 쉘 스크립트 파일을 생성한다 (vi 명령어를 미리 숙지 해야함)

vi test.sh

- 파일을 만들기전에 해당 디렉토리로 먼저 이동

- .sh 란 확장자가 쉘 스크립트

 

2. vi 에디터가 실행이 되면 명령어 작성

#!/bin/bash -> #! 은 쉘에게 이 프로그램을 실행하기 위해서 #! 다음에 오는 아규먼트를 실행프로그램으로 사용한다는 것을 알려주기 위함

( 참고 ) 첫줄의 #은 주석의 의미가 아니라 어떤 언어로 작성했는지 해석기에게 전달하는 역활

#!/bin/perl 펄 스크립트

#!/usr/bin/expect expect 스크립트

스크립트 첫줄에 써주는 문구 -> 파일명 뒤에 확장자를 붙여주지 않아도 정상적으로 동작

 

echo "test" #test라는 문자열 출력 -> # : 주석

~

~

:wq

 

3. 쉘 스크립트를 실행하기전 실행 권한 부여

파일의 읽기/쓰기 권한은 있지만 실행 권한은 없다.

# chmod +x test.sh

 

4. 쉘 스크립트 실행

절대경로 실행

/root/test.sh

상대경로 실행

./test.sh

 

.은 현재경로 ..은 한단계 상위경로를 나타냄

 

* 변수

- 데이터 타입이 없다

- 대소문자를 구분한다

- 값을 대입시 변수명=값

- 변수를 사용할 때는 $변수명 or ${변수명}

 

#!bin/bah

i=10;

z-"test";

 

echo $i;

echo $z;

 

실행시

10

test

 

* if문

(띄어쓰기 주의)

 

A -eq B    : A와 B의 값이 같다

A -ne B    : A와 B의 값이 같지 않다

A -gt B    : A가 B보다 크다

A -lt B    : A가 B보다 작다

A -ge B    : A가 B보다 작다

A -qe B    : A가 B보다 크거나 같다

A -le B    : A가 B보다 작거나 같다

 

if [ $i -eq $z ]; then

echo "ok";

else

echo "no";

fi

 

echo " yes or no"

read answer

if [ "$answer" = "yes" ]; then

echo "success";

elif [ "#answer" = "no" ]; then

echo "fail";

else

echo "sorry";

fi

 

 

* for문

for문은 2가지 방법이 있다.

 

1. arg 변수에 1,2,3 데이터를 넣고 이 갯수만큼 돈다.

 

for arg in 1 2 3

do

echo $arg

done

 

2. 기존 다른 언어 방식

for ((i=0; i<10; i++));do

echo $i

done

 

 

* while 문

 

kk=1;

while [ $kk -lt 5 ]

do

echo $kk;

let kk+=1; -> let : 산술연산 처리 명령어

done

 

 

* 함수

 

testFunction(){

echo "funcion start"

echo "directory `pwd`" -> pwd는 현재 디렉토리를 나타내는 명령어

}

 

testFunction;

 

 

 

연산자

문자열비교

[string] : string이 빈 문자열이 아니라면 참
["string1" = "string2"] : 두 문자열이 같으면 참
[“string1" != "string1" ] : 두 문자열이 같지 않으면 참.
 [ -n "string" ] : 문자열이 null(빈 문자열) 이 아니라면 참.
 [ -z "string" ] : 문자열이 null(빈 문자열)이라면 참

산술비교

[ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참.
 [ expr1 -ne expr2 ] : 두 표현식 값이 않다면 참.
 [ expr1 -gt expr2 ] :  expr1 이 expr2 보다 크다면 참
[ expr1 -ge expr2 ] : expr1 이 expr2 보다 크거나 같으면 참
[ expr1 -lt expr2 ] : expr1 이 expr2 보다 작다면 참
[ expr1 -le expr2 ] : expr1 이 expr2 보다 작거나 같으면 참

파일조건

[ -b file ] : file이 block device file이면 참
[ -c file ] : file이 character device file 이면 참
[ -d file ] : file이 directory file이면 참
[ -f file ] : file이 정규파일이면 참
[ -r file ] : file이 읽기권한이면 참
[ -w file ] : file이 쓰기권한이면 참
[ -x file ] : file이 실행권한이면 참
[ -L file ] : file이 symbolic link file이면 참
[ -e file ] : file이 존재하면 참

2. if 구문.

 단순 if 문

if [ 조건 ]
then
    실행문장
fi

if ~else 문

if [ 조건 ]
then
    실행문장
else
    실행문장
fi

if ~ else if 문

if [ 조건 ]
then
    실행문장
elif [ 조건 ]
then
    실행문장
fi

다중 if 문
if [ 조건 ]
then
    if [ 조건 ]
    then
          실행문장
  fi
 fi

3. and list / or list

and list

실행문장 && 실행문장 && 실행문장 && ....


=> 참이 될 때까지 실행문장을 실행한다.

or list

실행문장 || 실행문장 || 실행문장 || ...

=> 실행문장이 거짓이 될 때까지 실행한다.

4. case 구문

case 변수 in
  패턴 | 패턴 | ... )
    문장 ;;
  패턴 | 패턴 | ...)
          문장;;
  *)  문장 ;;
esac

5. while 구문

단순 while 문

while [ 조건 ]
do
    실행문장
done

다중 while 문


while [ 조건 ]
do
    while [ 조건 ]
        do
            실행문장
        done
 done

ex)
 echo -n "input password : "
 read password1
 echo -n "retype password : "
 read password2

while [ "$passowrd" != "$password2" ]
 do
    echo "password miss match try again"
    read password2
 done
 ecoh "OK ! password Match complete"

6. until 구문


until [ 조건 ]
do
    실행문장
done

ex)

until who | grep "$1" > /dev/null
 do
    sleep 5
 done
 echo "user $1 just logged in"

6 for 문

단순for 문

for 변수 in list
 do
    실행문장
done

다중 for 문


for 변수 in list
 do
    for 변수 in list
    do
        실행문장
    done
 done

ex)

for string in "hello" "unix" "world"
 do
    echo -n "$string "
 done

7. select 문.
select 변수 in list
 do
    실행문장
done

8. 함수

함수명 () {
    실행문장
    [ return value ]
 }

또는

function 함수명 {
    실행문장
    [ return value ]
 }

break / continue

break 제어문이나 조건문의 루프를 빠져나갈 때 사용한다.
continue : 제어문이나 조건문의 처음으로 돌아가서 다시 수행한다.
 :  의미 없는 명령. 논리 값 true를 대신해서 쓰기도 한다.

. 명령 - 스크립트를 실행. 스크립트 내에서 다른 파일을 include하는 경우에도 사용

exec - 현재 shell을 다른 shell 로 대체
exit n : 현재 shell 종료 시 리턴 값 n 반환
shift : shell의 인자를 오른쪽으로 하나 shift 한다.

ex)

echo $1
 shift
 echo $1
 shift 3
 echo $1

./script 1 2 3 4 5 6 7

1
 2
 5

정규표현식


정규표현식
정규 표현식이란 어떤 문자열의 집합을 표시하는 텍스트 스트링을 말하는 것으로 일반적으로
텍스트 형식 문서등에서 문자열을 찾아내고 치환하는데 많이 사용된다.
정규 표현식은 vi.ex,ed,sed,grep 등에서 사용되며 윈도우의 찾기 기능이나 바꾸기 기능과는 비교할
수 없는 편리함이나 강력한 기능을 갖고 있다.

“[문자열]”의 의미
정규 표현식에서 문자열이 “[ ]"로 둘러싸여 있으면 이문자열들중 하나를 의미하게 된다.
ex [0-9] : 숫자 한글자
  [a-z] : 소문자 한글자
[A-Z] : 대문자 한글자
[a-zA-Z] : 대소문자 관계없이 한글자
[Oo]wl : Owl 또는 owl  그러나 Oowl 은 해당되지 않는다.

"[ ]"안에서 “^”는 문자열중 ^이하를 포함하지 않는 문자열을 말한다.
 ex) [^0-9] : 숫자가 아닌 문자 하나를 의미한다.
    [-0-9] : 숫자 한 개 또는 - 기호를 의미한다.
    [^-0-9] : 숫자나 - 기호가 아닌 문자 하나를 의미한다
    [^A-Z] : 대문자를 제외한 문자
    c[a-z0-9]t : 두 번째 문자가 임의의 소문자나 숫자.

“^”와 $의 의미
“^”는 라인의 시작 부분을 의미하는 것인 반면 “$”는 라인의 끝 부분을 의미한다. 만약 “new"로
시작하는 부분을 찾고 싶다면 ”^new"라고 표현한다.

“\”
정규표현식에서는 특별한 의미를 지니고 있는 <>,()등의  기호들의 표현하기 위해 해당 문자의 바로
앞에 역슬래시를 사용하여 구분한다.
ex) \$$ : $로 끝나는 라인을 의미한다.
 
“.” : 아무문자나 한 개의 문자를 의미.

ex) [0-9]* : 숫자가 들어 있거나 그렇지 않은 부분을 의미.

확장 정규식
+ : + 기호 바로 이전의 글자나 정규식이 1회이상 반복 
ex. abc+ (c가 1회이상 반복) ==> abc, abcc, abcc 등
? : ? 기호 바로 이전의 글자나 정규식이 없거나 한번 존재
ex. abc? (c가 있거나 없거나) ==> ab,abc
( ) : 부분 정규식의 시작과 끝을 표시
ex. a(bc)* (bc가 0회 이상 반복) ==> a, abc, abcbc등
    a(bc)+ (bc가 1회 이상반복) ==> abc,abcc등
    a(bc)? (bc가 있거나 없거나) ==> a, abc 등
| (  ) 내의 단어들 중 최소 하나가 존재
ex. a(b|c) (b 또는 c가 최소 하나 존재 : ab, ac, abc, acb)

*. 텍스트 조작 및 필터명령
grep(get regular expression)
: 특정한 문자열을 포함하고 있는 라인을 찾기위해 사용한다.
자주사용되는 옵션
-v(invert) ; 찾고자 하는 문자열과 일치하는 라인을 제외한 모든 라인을 출력한다.
-n(number) ; 문자열이나 패턴을 일치시키는 라인들의 라인번호를 표시해준다.
-l(listfile) ; 특정한 패턴을 찾기위해 여러개의 파일을 검색할 때 편리하게 사용할 수 있다.
이 옵션은 패턴을 갖고 있는 줄을 찾아 보여주는 것이 아니라 그러한 줄이 발견된 파일명을 결과로
보여준다.

egrep(Extended grep) : 확장 정규식을 사용해서 grep 명령어로 표현할 수 없는 다양한 패턴을 나타낼
 수 있다.

fgrep(Fixed grep) : grep, egrep 명령어와 달리 정규식을 전혀 사용하지 않는다. 모든 패턴의 문자를
그대로 인식하므로 *, +, ^, $, [ ] 등의 문자도 모두 단순 문자로서만 인식한다.