[유닉스] 쉘 스크립트(Shell Script)


쉘 스크립트(Shell Script)

  • 스크립트 : “영화나 방송의 대본과 각본 따위의 방송 원고”
  • 컴퓨터 소프트웨어 : 컴파일 언어, 스크립트 언어
    • 컴파일 언어 : 프로그램 작성 –> 컴파일 –> 실행 파일 만들기
    • 스크립트 언어 : 인터프리터에 의해 실행됨
      • 언어 구조가 쉬워 빨리 배울 수 있음
      • 용도에 따라 제한이 있고, 다른 프로그램을 거쳐야 하기 때문에 실행 시간이 오래 걸림

쉘 스크립트 만들기

  • 테스트용 쉘 스크립트
$ vi test_script
$ cat test_script
#!/bin/bash
# This is a test script program.
echo Hello, World~!
pwd
$

쉘 스크립트에 이름 붙이기

  • 유닉스 명령 규칙에 따라 스크립트 파일에 이름 붙임
  • 스크립트 기능을 알 수 있도록
  • 어느 쉘을 위한 것인지 구분하기 위한 확장자 사용
    • 본 쉘 스크립트는 sh, 콘 쉘은 ksh, C 쉘은 csh, 배시 쉘은 bash 사용
  • 스크립트 이름으로 키워드, 앨리어스, 내장 명령과 같은 이름을 쓰지 않는게 좋다.
  • 배시 쉘에서 명령 실행 순서
    • 앨리어스
    • 키워드(if, while, until 등)
    • 함수
    • 내장 명령
    • 스크립트와 유닉스 명령, 유틸리티 등(PATH 경로에 있는 실행 가능한 파일)

쉘 스크립트 실행하기

  • 실행하는 방법
    • 쉘이 실행하도록 스크립트 파일명을 인수로 넘겨주는 방법
    • 파일에 실행 권한을 주어 자체적으로 실행하는 방법
$ bash test_script
Hello, World~!
/home/ksshin/Unix/ch13
$ test_script
test_script: command not found
$
  • 두 번째 방법으로 실행하기 위해서는 test_script에 실행 권한 필요
    • 경로 설정에 현재 디렉토리가 지정되지 않아 오류 메시지 출력됨
    • 해결 방법
      • ./test_script로 실행
      • ~/.profile에서 PATH 변수의 가장 마지막에 .을 추가한 다음 저장한 후 ~/.profile을 실행
$ chmod +x test_script
$ test_script
test_script: command not found
$
$ ./test_script
Hello, World~!
/home/ksshin/Unix/ch13
$

쉘 스크립트 종료하기

  • 스크립트는 파일의 마지막 명령을 실행하고 파일의 끝이 exit 명령을 만나면 종료
  • 종료 상태를 $? 변수에 저장
  • exit 명령
    • 종료 값을 지정하며 스크립트를 종료
    • 형식 : exit [n]
  • 사용 예 : exit, exit 1
$ cat test_exit
#!/bin/bash
# test_exit
exit 20
$ ./test_exit
$ echo $?
20
$

스크립트 파일의 구성요소

  • ’#!’ 기호
    • 스크립트 첫 행의 #! 기호는 매직 넘버라고 함
    • 스크립트를 처리할 프로그램(인터프리터)을 지정(#!/bin/bash)
    • 커널이 이것을 보고 지정된 프로그램을 실행, 스크립트를 인자로 전달
    • 옵션을 함께 지정할 수도 있음
    • 매직 넘버는 항상 스크립트의 첫 행에 있어야 함
    • 꼭 필요한가? i) 배시 쉘 기준으로 작성한 프로그램을 C 쉘이 처리하면 오류 발생할 수 있음 ii) 스크립트에서 일반적인 유닉스 명령만 사용하면 이 행은 없어도 됨
  • 주석
    • 프로그램에 대한 설명으로 #으로 시작
    • 전체 행 모두를 주석으로 처리할 수도 있음
    • 스크립트 명령문 다음에 나올 수도 있음
    • 작성된 스크립트를 이해하기 쉽게 해주므로 주석을 이용한 설명을 빠뜨리지 않는게 좋음
  • 쉘 명령
    • 쉘의 모든 명령을 스크립트의 내용으로 사용 가능
    • 여러 명령을 순차적으로 반복 수행해야 할 때 명령의 입력이 귀찮으면 파일로 작성한 후 저장해 두었다가 필요할 때마다 실행
    • 유닉스 시스템은 부팅할 때마다 처리할 다양한 작업을 스크립트로 작성해 실행함
    • 스크립트를 찾는 스크립트의 예
$ cat find_script
#!/bin/bash
# find_script : find shell script in /bin & /usr/bin
cd /bin
file * | grep script
cd /usr/bin
file * | grep script
$
  • 실행 권한을 부여한 후 실행시킴
$ chmod +x find_script
$ ./find_script | more
bzdiff: POSIX shell script, ASCII text executable
bzexe: POSIX shell script, ASCII text executable
bzgrep: POSIX shell script, ASCII text executable
bzmore: POSIX shell script, ASCII text executable
gunzip: Bourne-Again shell script, ASCII text executable
......
$
  • 쉘 프로그램
    • 쉘 스크립트는 유닉스 명령뿐 아니라 각 쉘이 제공하는 프로그램을 위한 구문도 사용할 수 있음
    • 쉘 변수, 인자 처리, 각종 연산자, 제어문 등 포함