Infrastructure/Linux

[Concept] Chapter 13 배시 쉘 프로그래밍

Jinlib 2017. 12. 25. 17:00

목차

1. 쉘 스크립트
2. 쉘 변수 사용하기
3. 입력 받기
4. 연산자
5. 제어문
6. 함수
7. 디버깅


1. 쉘 스크립트

(1) 스크립트란?

인터프리터라 불리는 다른 프로그램에 의해 실행되는 프로그램 ex) 자바스크립트, perl, python

(2) 쉘 스크립트

    • 쉘이 실행하는 프로그램
    • 유닉스 명령 + 쉘이 제공하는 프로그램 구성 요소
    • 쉘 스크립트 파일 이름은 키워드나 엘리어스, 내장 명령과 같은 이름을 쓰지 않는 것이 바람직하다.
      ※ 쉘 명령 실행 순서 : Alias -> Keyword(if, while, until 등) -> function -> internal operation(cd, echo 등)
                                  -> Script, Utility 등 PATH 경로에 있는 실행가능한 파일

(3) 쉘 스크립트 만들기

1) vi 에디터로 편집

1
2
3
4
5
#!/bin/bash
# My First Script Program
 
printf "I love UNIX !\n"
pwd
cs
이와 같이 만들 수 있다.

2) 쉘 스크립트 실행 방법

      • 첫번째 방법 (쉘을 실행하면서 인자로 스크립트 이름 지정)


      • 두번째 방법 ( 파일을 직접 실행 )

3) 쉘 스크립트 종료하기

1
2
3
4
#!/bin/bash
#test_exit : exit과 $?를 테스트하는 프로그램
 
exit 20
cs

스크립트의 종료 상태를 $? 변수에 저장한다.

(4) 스크립트 파일의 구성요소

1) #!

매직 넘버라고 불린다.
스크립트 파일의 가장 처음에 위치한다.
스크립트를 실행할 프로그램을 지정해주는것.
( 쉘이 아닌, 다른 실행가능한 명령을 지정해 줘도 된다. ex) #!/bin/more

2) # 

주석(Comment)라고 하며, 프로그램에 대한 설명할때 주로 쓰인다.

3) 쉘 명령

쉘이 실행할 수 있는 모든 명령어 사용 가능하다. (예, cd /bin,file * | grep "script" 등)
여러 명령을 반복 수행해야 할 때 스크립트 파일로 저장하여 실행한다.

4) 쉘 프로그램

각 쉘이 제공한느 프로그램을 위한 구문
쉘 변수, 인자처리, 각종 연산자, 제어문 등 포함


2. 쉘 변수 사용하기

(1) 정의

1) 변수란?

프로그램에서 처리하는 다양한 정보를 처리하는 곳

2) 종류

쉘 변수(현재 쉘에서만 사용 가능), 환경변수(모든 쉘에서 사용가능)

3) 지정방법

변수명 = 값

4) 쉘 변수 표현식


(2) 쉘 변수 문자열 처리

변수의 값이 문자열일 때 문자열 내 패턴을 찾아 일부분을 제거하는 표현식

(3) 명령행 인자 처리

1) 명령행 인자?

스크립트를 실행 할 때 인자로 주어진 값

2) 위치 매개 변수

명령행 인자를 저장하는 스크립트 변수
인자의 위치에 따라 이름이 정해짐


(4) 쉘 특수문자 및 명령 처리

1) 인용 부호

쉘 특수문자의 의미를 없애기 위해 사용한다.

2) 명령 대체

명령 실행 결과를 문자열로 변환


3. 입력 받기

(1) 사용자로부터 입력 받기 - read

1) 기 능

쉘 내장 명령으로 터미널이나 파일로부터 입력을 처리한다.

2) 형 식

3) 사용예시

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 키보드 입력 처리를 테스트 하는 스크립트 
 
read   x                                 # 아무 메시지 없이 사용자 입력을 기다림 
echo  "x : $x"                         # 사용자가 임의의 값을 입력하면 출력 
 
read  x   y                              # 첫 단어는 x, 나머지는 y에 저장
echo "x is $x  y is $y"                # x, y 값 출력 
 
read  -p “Input : “                     # Input : 을 출력한 후 입력 기다림
echo "input : $REPLY"                # $REPLY에 자동 저장된 입력값 출력
 
cs

(2) 문서를 통한 입력 - here 문서

1) 기능

표준 입력을 사용자로부터 직접 받아들이지 않고 자동 처리
TERMINATOR가 입력될 때까지 기술된 부분을 키보드 입력으로 처리한다.

2) 형 식

명령 << TERMINATOR
입력내용
TERMINATOR

3) 사용 예시

1
2
3
4
5
6
7
#!/bin/bash
#  here 문서 테스트. user1에게 메일을 보냄 
 
 mail user1 << END 
 This is a test mail for here document 
 END 
 
cs
여기서 END가 terminator로 쓰였다.


4. 연산자

(1) 정의

프로그램에서 자료를 처리하는 방법
산술 연산자, 비교 연산자, 논리 연산자, 비트 연산자 제공
수치 연산자 사용시 let 또는 (( )) 사용해야한다.

(2) 종류

5. 제어문

(1) 정의 

프로그램 내의 문장 실행 순서를 제어하는 것

(2) 종류

1) 선택적 실행문

프로그램 실행문을 조건에 따라 선택적으로 실행 (ex. if, case)

2) 반복 실행문

프로그램 실행문을 정해진 횟수나 조건에 따라 반복 수행(ex. while, do, for)


(3) 조건 테스트

1) 조건 테스트 - 문자열 연산자


2) 조건 테스트 - test 플래그

(4) 선택적 실행문

1) if

조건명령이 거짓일 때 새로운 분기 명령(elif) 실행한다.

참이면 then 이후의 명령을 실행한다. 어느것도 맞지 않으면 else로 간다.

예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#  test_elif: if-elif 문 테스트 
     
echo  “Input Score : “
read score
 
if (( $score >= 90 )) 
then 
   echo  “Your score is great. “
elif (( $score >= 80 )) 
then 
   echo  “Your score is good. “
else 
   echo “Your score is not good. “ 
fi 
cs

결과)


2) case 문

주어진 변수의 값에 따라 실행할 명령 따로 지정
변수의 값이 value1 이면 value1부터 ;;을 만날 때까지 명령 실행
값의 지정에 특수기호, | (or 연산자) 사용 가능
일치하는 값이 없으면 기본값인 * 부터 실행

예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
# case 테스트 스크립트
 
echo "Select command :"
read  cmd
 
case $cmd in
[0-9])                # 0부터 9까지 임의의 숫자
   date
   ;;
"cd" | "CD")        # cd 또는 CD
   echo $HOME
   ;;
[aA-C]*)             # 소문자 a, 대문자 A,B,C로 시작하는 임의의 문자열
   pwd
   ;;
*)
   echo" Usage : select command"
   ;;
esac

cs


결과)



(4) 반복 실행문

1) for문

list 대신 $(

Tip) list 대신 $(<file)을 사용하면 외부 파일의 내용을 입력으로 받아서 처리한다.

예시)

1
2
3
4
5
6
7
#!/bin/bash
#  test_for: for 테스트 스크립트 
 
for num in 0 1 2 
do 
   echo "Number is $num" 
done 
cs

결과)


2) while문

조건 명령이 정상 실행되는 동안 명령을 반복한다.

예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash 
# test_while: while을 이용해 1부터 10까지 합을 구하는 스크립트 
 
count=1                    
sum=0 
 
while (( count <= 10 ))     
do 
     (( sum += count ))       
     let  count+=1             
done 
 
echo "Sum(1~10) : $sum" 
cs

결과)


3) until문

조건 명령이 정상 실행될 때까지 명령 반복

예시)

1
2
3
4
5
6
7
8
9
10
#!/bin/bash 
# test_until: 지정한 사용자가 로그인하면 알리는 스크립트 
 
echo  "Input name :"   # 입력 안내문 출력
read  person                  # 유저 이름을 person에 저장 
 
until  who | grep $person   # > /dev/null 
do 
    sleep  5                 # 유저가 접속 중이 아니면 5초 쉼 
done 
cs

결과)

sys1790은 온라인이기 떄문에 뜨고 sys1763은 오프라인이기떄문에 sleep상태이다.


4) select 문

      • 메뉴를 생성할 수 있는 반복 실행문이다.

      • list에 지정한 항목을 자동으로 선택 가능한 메뉴로 만들어 화면에 출력해준다.

      • 사용자는 각 항목에 자동으로 부여된 번호를 선택한다.

      • 사용자 입력은 select와 in 사이에 지정된 변수에 저장

      • 보통 case 문과 결합하여 입력 값을 처리한다.

예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash 
# test_select: 사용자 입력에 따라 pwd,date 명령실행 
 
PS3="Input command(1~3) " 
 
select cmd in pwd date quit 
do                           
   case $cmd in             
   pwd) 
        pwd ;; 
   date) 
        date;; 
   quit) 
        break;;               
   *
        echo "Invalid input. select number" 
        ;; 
   esac 
   REPLY= 
done 
cs


결과)


5) 루프 제어문 - continue

      • 루프 안에서 사용한다.
      • 이후 실행 순서를 무시하고 루프의 처음으로 돌아가는 명령
      • 숫자를 지정하면 중첩된 루프 안에서 특정 루프의 처음으로 돌아갈 수 있다.
예시)

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#  test_cont: continue 테스트 
 
for person in $(< list)          # `cat list`와 동일 
do 
    if [[ $person == user2 ]] then 
       continue                    # user2 이면 건너뜀
    fi 
    echo “Hello, $person”
done 
cs

결과)


6. 함수

(1) 정의

함수 : 하나의 목적으로 사용되는 명령들의 집합


(2) 선언 하는 법

함수와 앨리어스와 공통적인 부분도 있는 반면에 차이점도 있다.
함수는 조건에 따라 처리가 가능하고 인자 처리가 가능하다.

1) 정의된 함수 확인

typeset -f 명령어를 통해 시스템에 등록된 함수를 확인 할 수 있다.


(3) 함수의 종료 - return

1) 함수 종료 조건

함수 본문 안의 마지막 문장 실행
return 문 실행
+) 지정한 값이 함수의 종료값으로 $?에 저장된다.

예시)

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#  함수 리턴값 테스트 
 
function sum { 
   typeset  sum 
 
   (( sum= $1 + $2 )) 
   return $sum 
 
sum $1 $2 
echo "$1 + $2 = $?"  

cs

결과)

add 3 4
3 + 4 = 7


(4) 함수 삭제 - unset

1) 기 능

정의된 함수를 삭제

2) 형 식

unset -f 함수명

7. 디버깅

스크립트 실행도중 발생한 오류를 수정하는 방법이다.

(1) bash -x

1) 기 능

가장 간단한 스크립트 실행 오류 수정방법이다.
스크립트의 각 행이 실행될 때마다 화면에 출력된다.

2) 형 식

bash -x 함수명

3) 사용 예제

bash -x test_while 실행시.


(2) trap

1) 기 능

      • 지정한 시그널이 스크립트로 전달될 때마다 지정한 명령 실행
      • 스크립트의 명령이 한 줄씩 실행될 때마다 DEBUG 시그널이 스크립트로 전달된다.
      • DEBUG 시그널을 받을 때마다 원하는 변수 값 출력이 가능하다.   
        => 즉. 스크립트가 실행되는 도중 변수값 확인이 가능하다.

2) 형 식

trap 명령 시그널

3) 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash 
# test_trap: trap 테스트 스크립트 
 
trap  'echo "$LINENO : count=$count " '  DEBUG
 
count=1                    
sum=0 
 
while (( count <= 10 ))     
do 
     (( sum += count ))       
     let  count+=1             
done 
 
echo "Sum(1~10) : $sum "
 
cs


결과)