(본 강의 노트는 한빛 미디어의 <유닉스 이론과 실습> 책을 기반으로 하고 있습니다)
ch13. 배시쉘 프로그래밍
학습목표
- 다양한 쉘 변수를 이해하고 활용하는 방법을 익힌다
- 사용자로부터 입력을 받아 스크립트 파일에서 처리하는 방법을 익힌다
- 다양한 연산자와 문자열 테스트, 파일 테스트를 활용하는 방법을 익힌다
- 조건문과 반복문의 사용 방법을 익힌다
- 함수를 이용해 스크립트를 작성하는 방법을 익힌다
- 스크립트의 실행 오류를 찾아 수정하는 방법을 익힌다
목차
- 쉘 스크립트
- 쉘 변수 사용하기
- 사용자로부터 입력 받기
- 연산자
- 제어문
- 함수
- 디버깅
01. Shell 스크립트
스크립트
- 인터프리터라 불리는 다른 프로그램에 의해 실행되는 프로그램
- 자바스크립트, 파이썬
shell 스크립트란?
- Shell이 실행하는 프로그램
- 유닉스 명령 + Shell이 제공하는 프로그램 구성 요소
- Shell 스크립트 파일 이름은 키워드나 앨리어스, 내장 명령과 같은 이름을 쓰지 않는 것이 바람직함
- 명령 실행 순서
: allias -> keyword -> function -> inner command(cd, echo and etc) -> 실행 가능한 파일
Shell 스크립트 만들기
: vi 에디터로 편집
Shell 스크립트 실행하기
- Shell 을 실행하면서 인자로 스크립트 이름 지정
- 파일을 직접 실행
- 실행 방법
- bash filename.sh / source filename.sh
- chmod +x filename.sh ( change mode to executable) -> 이후 ./filename.sh로 실행 가능
Shell 스크립트 종료하기 : exit
- 스크립트의 종료
- exit[n]
- 종료 상태를 $? 변수에 저장
- 스크립트가 종료되는 경우는?
- 파일의 마지막 명령을 실행
- exit 문 실행
스크립트 파일의 구성요소 : #!
- 매직넘버
- 파일의 가장 처음에 위치
- 스크립트를 실행할 프로그램 지정
- 각 Shell마다 제공하는 스크립트 언어의 문법이 조금씩 다르므로, 이 스크립트를 실행할 Shell을 지정해주어야 올바로 실행됨
- Shell이 아닌, 다른 실행 가능한 명령을 지정해주어도 됨
스크립트 파일의 구성요소 :
- 주석
- 프로그램에 대한 설명
스크립트 파일의 구성요소 : Shell 명령
- Shell이 실행할 수 있는 모든 명령어 사용 가능
- 여러 명령을 반복 수행해야 할 때 스크립트 파일로 저장하여 실행
스크립트 파일의 구성요소 : Shell 프로그램
- 각 쉘이 제공하는 프로그램을 위한 구문
- 쉘 변수, 인자 처리, 각종 연산자, 제어문 등을 포함
02. Shell 변수 사용하기
변수란?
: 프로그램에서 처리하는 다양한 정보를 저장하는 곳
- 종류
- Shell 변수(현재 Shell에서만 사용 가능)
- 환경변수(모든 Shell에서 사용 가능)
- 지정 방법
- 변수명 = 값
- 사용예제
Shell 변수 문자열 처리하기
- 변수의 값이 문자열일 때 문자열 내 패턴을 찾아 일부분을 제거하는 표현식
- 2.x 이전의 배시Shell에서는 동작하지 않음
- Shell 변수 문자열 처리 : %, #
- 사용 예
- % : 뒤에서부터 패턴과 일치하는 최소 부분을 제거(%%는 최대부분)
- #: 앞에서부터 패턴과 일치하는 최소 부분을 제거(##은 최대부분)
명령행 인자 처리
- 명령행 인자
- 스크립트를 실행할 떄 인자로 주어진 값
- 위치 매개 변수
- 명령행 인자를 저장하는 스크립트 변수
- 인자의 위치에 따라 이름이 정해짐
명령행 인자 | 의미 |
$0 | 쉘 스크립트의 이름 |
$1 - $9 | 명령행에 주어진 첫번째부터 9번째까지 인자 |
$(10) | 10번째 인자 |
$# | 전체 인자 개수 |
$* | 모든 인자 |
$@ | $*과 같은 의미 |
“$*” | “$1 $2 $3” |
“$@" | “$1” “$2” “$3” |
$? | 최근 실행된 명령의 종료값 |
Shell 특수문자 및 명령 처리
- 인용 부호 : Shell 특수 문자의 의미를 없애기 위해 사용
- ' ' : 모든 특수문자들이 해석되는 것을 막음
- " " : 변수나 명령의 대체만 허용
- \ : 단일 문자가 해석되는 것을 막음
- 명령 대체 : 명령 실행 결과를 문자열로 반환
- 백쿼터(₩ ₩)
- $(명령)
03. 사용자로부터 입력 받기
사용자로부터 직접 입력 : read
- Shell 내장 명령으로 터미널이나 파일로부터 입력 처리
- 사용 형식
형식 | 의미 |
read x | 표준입력에서 한 행을 입력 받아 x에 저장 |
read first last | 표준입력에서 한 행을 입력받아 첫번째 단어를 first에 저장하고 나머지 모두를 last에 저장 |
read -p prompt | prompt를 출력하고 입력을 기다린다. 입력된 값은 REPLY 변수에 저장 |
here 문서를 통한 입력 : <<
- 표준 입력을 사용자로부터 직접 받아들이지 않고 자동 처리
- TERMINATOR가 입력될 때까지 기술된 부분을 키보드 입력으로 처리
- 키보드 입력을 종료 문자로 사용되는 EOF문자를 파일 안에서 사용할 수 없기 떄문에 입력 종료를 나타내는 문자열을 지정하여 사용
04. 연산자
- 프로그램에서 자료를 처리하는 방법
- 산술 연산자, 비교 연산자, 논리 연산자, 비트 연산자 제공
- 수치 연산자 사용시 let 또는 (()) 를 사용해야 함
05. 제어문
- 프로그램내의 문장 실행 순서를 제어하는 것
- 선택적 실행문
- 프로그램 실행문을 조건에 따라 선택적으로 실행
- If, select
- 반복 실행문
- 프로그램 실행문을 정해진 횟수나 조건에 따라 반복 실행
- while, do, for
선택적 실행문 : if-then-else
: 주어진 조건의 참, 거짓 여부에 따라 명령 실행
선택적 실행문 : if-then-elif-else
: 주어진 조건의 참, 거짓 여부에 따라 명령 실행
조건 테스트 : 문자열 연산자
- 조건 명령에 사용하는 문자열 연산자
- 내장 명령 [ [ ] ] 사용
문자열연산자 | 동작 |
string = pattern string == pattern | string이 pattern과 일치. = 연산자 양쪽에 공백 |
string != pattern | string이 pattern과 일치하지 않음 |
string | string이 널이 아님 |
-z string | string의 길이가 0 |
-n string | string의 길이가 0이 아님 |
-l string | string의 길이 |
조건 테스트 : 테스트 플래그
- 파일 관련 테스트
test 플래그 | 기능 |
-a file | 파일이 존재 |
-e file | 파일이 존재 |
-L file | 심볼릭 링크 파일 |
-O file | 사용자가 file의 소유자 |
-G file | 파일의 그룹 ID가 스크립트의 그룹 ID와 같음 |
-S file | 소켓 파일 |
test 플래그 | 기능 |
-r file | 읽기 가능 |
-w file | 쓰기 가능 |
-x file | 실행 가능 |
-b file | 블록 장치 특수 파일 |
-c file | 문자 장치 특수 파일 |
-d file | 디렉토리 파일 |
-p file | 파이프 파일 |
-u file | setuid 권한 부여 파일 |
-g file | setgid 권한 부여 파일 |
-k file | sticky bit 접근 권한 부여 파일 |
-s file | 파일의 크기가 0이 아님 |
선택적 실행문 : case 문
- 주어진 변수의 값에 따라 실행할 명령 따로 지정
- 변수의 값이 value1이면, value1 부터 ;;을 만날 때까지 명령 실행
- 값의 지정에 특수기호, |(or operator) 사용 가능
- 일치하는 값이 없으면 기본값인 *부터 실행
반복 실행문 : for
- 리스트 안의 값들에 대해 지정한 명령을 순차 실행
반복 실행문 : while
- 조건 명령이 정상 실행되는 동안 명령 반복
반복 실행문 : until
- 조건 명령이 정상 실행될때까지 명령 반복
반복 실행문 : select
- 메뉴를 생성할 수 있는 반복 실행문
- list에 지정한 항목을 자동으로 선택 가능한 메뉴로 만들어 화면에 출력해줌
- 사용자는 각 항목에 자동 부여된 번호를 선택
- 사용자 입력은 select, in 사이에 지정된 변수에 저장
- 보통 case 문과 결합하여 입력 값 처리
루프 제어문 : continue
- 루프 안에서 사용
- 이후 실행 순서를 무시하고 루프의 처음으로 돌아가는 명령
- 숫자를 지정하면 중첩된 루프 안에서 특정 루프의 처음으로 돌아갈 수 있음
06. 함수
함수란?
하나의 목적으로 사용되는 명령들의 집합
앨리어스와의 차이점
- 조건에 따라 처리 가능
- 인자 처리 가능
함수의 종료 : return
- 함수 종료 조건
- 함수 본문 안의 마지막 문장 실행
- return 문 실행
- 반환값
- 단, 리턴문으로 값을 반환시 최대 256까지의 값밖에 반환이 되지 않는다
- 해결방법, 전역변수를 선언하여 전역변수에 함수안에서 계산한 값을 저장하고 return;해줌
함수 삭제 : unset
- 정의된 함수를 삭제
- unset -f 함수명
07. 디버깅
스크립트 실행 중 발생한 오류 수정 방법
구문 오류
- Shell이 실행 도중 구문오류가 발생한 라인번호 출력
- 실행 오류
- 오류 메시지 없이 실행이 안되거나 비정상 종료
- 오류 수정방법
- bash -x, trap
디버깅 : bash -x
- 가장 간단한 스크립트 실행 오류 수정방법
- 스크립트의 각 행이 실행될 때마다 화면에 출력됨
- 디버깅 시 유용한 듯
'Computer Science > 유닉스프로그래밍' 카테고리의 다른 글
[유닉스 시스템 프로그래밍] Ch04. 시스템 정보 (0) | 2020.10.19 |
---|---|
[유닉스 이론과 실습] ch06. 파일 접근 권한 관리하기 (0) | 2020.10.19 |
[유닉스 이론과 실습] ch04. vi 사용법 익히기 (0) | 2020.10.18 |
Introduction UNIX (0) | 2020.10.18 |
[유닉스 시스템 프로그래밍] Ch02. 파일 입출력 (0) | 2020.09.27 |