고급 Bash 스크립팅 가이드
로빈아빠
본문
Bash를 이용한 쉘 스크립팅 완전 가이드
Mendel Cooper
Brindlesoft
thegrendel (at) theriver.com
차현진
terminus (at) kldp.org
2001년 12월 16일
본 튜토리얼은 여러분이 Bash에 대해서 어떠한 사전 지식도 없다고 가정을 합니다만, 금방 중/고급 수준의 명령어들을 소개합니다(...유닉스의 슬기롭고 교훈적인 부분들을 배워 나가면서). 이 문서는 교과서나, 혼자 공부할 때 볼 수 있는 메뉴얼, 쉘 스크립팅 기술에 대한 레퍼런스및 소스로 쓰일 수 있습니다. 스크립트를 배우는 유일한 방법은 스크립트를 직접 짜 보는 것이다라는 전제하에, 연습문제와 아주 자세하게 주석 처리된 예제들로 능동적인 독자들의 참여를 유도할 것입니다.
이 문서의 최신 버전은 저자의 홈페이지에서 SGML 소스와 HTML을 "타르볼"형태로 얻을 수 있습니다. 고침 변경 사항은 change log를 참고하세요.
고친 과정 | ||
---|---|---|
고침 0.1 | 2000년 6월 14일 | 고친이 mc |
초기 릴리스. | ||
고침 0.2 | 2000년 10월 30일 | 고친이 mc |
버그 수정, 내용및 예제 스크립트 추가. | ||
고침 0.3 | 2001년 2월 12일 | 고친이 mc |
메이저 업데이트. | ||
고침 0.4 | 2001년 7월 8일 | 고친이 mc |
버그 수정, 더 많은 내용및 예제 추가 - 완전한 책 형태의 개정판. | ||
고침 0.5 | 2001년 9월 3일 | 고친이 mc |
메이저 업데이트. 버그 수정, 내용 추가, 장과 절을 재편성. | ||
고침 1.0.11 | 2001년 12월 16일 | 고친이 mc |
버그 수정, 재편성, 내용 추가. Stable release. |
바치는 글
모든 마법의 근원인 Anita에게 이 책을 바칩니다.
- 차례
- Part 1. 소개
-
- 1. 왜 쉘 프로그래밍을 해야 하죠?
- 2. #! 으로 시작하기
-
- 2.1. 스크립트 실행하기
- 2.2. 몸풀기 연습문제(Preliminary Exercises)
- Part 2. 기초 단계
-
- 3. 종료와 종료 상태(Exit and Exit Status)
- 4. 특수 문자
- 5. 변수와 매개변수 소개
-
- 5.1. 변수 치환(Variable Substitution)
- 5.2. 변수 할당(Variable Assignment)
- 5.3. Bash 변수는 타입이 없다(untyped)
- 5.4. 특수한 변수 타입
- 6. 쿼우팅(quoting)
- 7. 테스트
-
- 7.1. 테스트(Test Constructs)
- 7.2. 파일 테스트 연산자
- 7.3. 비교 연산자(이진)
- 7.4. 중첩된 if/then 조건 테스트
- 7.5. 여러분이 테스트문을 얼마나 이해했는지 테스트 해보기
- 8. 연산자 이야기(Operations and Related Topics)
-
- 8.1. 연산자(Operators)
- 8.2. 숫자 상수(Numerical Constants)
- Part 3. 중급 단계(Beyond the Basics)
-
- 9. 변수 재검토(Variables Revisited)
-
- 9.1. 내부 변수(Internal Variables)
- 9.2. 문자열 조작
- 9.3. 매개변수 치환(Parameter Substitution)
- 9.4. 변수 타입 지정: declare 나 typeset
- 9.5. 변수 간접 참조
- 9.6. $RANDOM: 랜덤한 정수 만들기
- 9.7. 이중소괄호(The Double Parentheses Construct)
- 10. 루프와 분기(Loops and Branches)
-
- 10.1. 루프
- 10.2. 중첩된 루프
- 10.3. 루프 제어
- 10.4. 테스트와 분기(Testing and Branching)
- 11. 내부 명령어(Internal Commands and Builtins)
-
- 11.1. 작업 제어 명령어
- 12. 외부 필터, 프로그램, 명령어
-
- 12.1. 기본 명령어
- 12.2. 복잡한 명령어
- 12.3. 시간/날짜 명령어
- 12.4. 텍스트 처리 명령어
- 12.5. 파일, 아카이브(archive) 명령어
- 12.6. 통신 명령어
- 12.7. 터미널 제어 명령어
- 12.8. 수학용 명령어
- 12.9. 기타 명령어
- 13. 시스템과 관리자용 명령어
- 14. 명령어 치환(Command Substitution)
- 15. 산술 확장(Arithmetic Expansion)
- 16. I/O 재지향
- 17. Here Documents
- 18. 쉬어가기
- Part 4. 고급 주제들(Advanced Topics)
-
- 19. 정규 표현식(Regular Expressions)
-
- 19.1. 정규 표현식의 간략한 소개
- 19.2. Globbing
- 20. 서브쉘(Subshells)
- 21. 제한된 쉘(Restricted Shells)
- 22. 프로세스 치환(Process Substitution)
- 23. 함수
- 24. 별칭(Aliases)
- 25. 리스트(List Constructs)
- 26. 배열
- 27. 파일들
- 28. /dev 와 /proc
- 29. 제로와 널(Of Zeros and Nulls)
- 30. 디버깅
- 31. 옵션
- 32. 몇 가지 지저분한 것들(Gotchas)
- 33. 스타일 있게 스크립트 짜기
-
- 33.1. 비공식 쉘 스크립팅 스타일시트
- 34. 자질구레한 것들
-
- 34.1. 대화(interactive)형 모드와 비대화(non-interactive)형 모드 쉘과 스크립트
- 34.2. 쉘 래퍼(Shell Wrappers)
- 34.3. 테스트와 비교: 다른 방법
- 34.4. 최적화
- 34.5. 팁 모음(Assorted Tips)
- 34.6. 괴상한 것(Oddities)
- 34.7. 이식성 문제(Portability Issues)
- 34.8. 윈도우즈에서의 쉘 스크립팅
- 35. Bash, 버전 2
- 36. 후기(Endnotes)
-
- 36.1. 저자 후기(Author's Note)
- 36.2. 저자에 대해서
- 36.3. 이 책을 만드는데 쓴 도구들
-
- 36.3.1. 하드웨어
- 36.3.2. 소프트웨어와 프린트웨어
- 36.4. 크레딧
- 서지사항
- A. 여러분들이 보내준 스크립트들(Contributed Scripts)
- B. Sed 와 Awk 에 대한 간단한 입문서
- C. 특별한 의미를 갖는 종료 코드
- D. I/O와 I/O 재지향에 대한 자세한 소개
- E. 지역화(Localization)
- F. 샘플 .bashrc 파일
- G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환
- H. 연습문제
- I. Copyright
- 표 목록
- 11-1. 작업 ID(Job Identifiers)
- 31-1. bash 옵션들
- B-1. 기본 sed 연산자
- B-2. 예제
- C-1. "예약된" 종료 코드
- G-1. 배치 파일 키워드/변수/연산자 와 그에 해당하는 쉘 동의어
- G-2. 도스 명령어와 동일한 유닉스 명령어
- 예 목록
- 2-1. cleanup: /var/log 에 있는 로그 파일들을 청소하는 스크립트
- 2-2. cleanup: 위 스크립트의 향상되고 일반화된 버전.
- 3-1. 종료/종료 상태
- 3-2. !으로 조건을 부정하기
- 4-1. 코드 블럭과 I/O 재지향
- 4-2. 코드 블럭의 결과를 파일로 저장하기
- 4-3. 최근 하루동안 변경된 파일들을 백업하기
- 5-1. 변수 할당과 치환
- 5-2. 평범한 변수 할당
- 5-3. 평범하고 재미있는 변수 할당
- 5-4. 정수? 문자열?
- 5-5. 위치 매개변수
- 5-6. wh, whois 도메인 네임 룩업
- 5-7. shift 쓰기
- 6-1. 이상한 변수를 에코하기
- 6-2. 이스케이프된 문자들
- 7-1. 무엇이 참인가?
- 7-2. [ ] 와 test 의 동일함
- 7-3. (( ))로 산술식 테스트 하기
- 7-4. 산술 비교와 문자열 비교
- 7-5. 문자열이 널인지 테스트 하기
- 7-6. zmost
- 8-1. 산술 연산자 쓰기
- 8-2. && 와 || 를 쓴 복합 조건 테스트
- 8-3. 숫자 상수 표기법:
- 9-1. $IFS 와 빈 칸
- 9-2. 타임 아웃 처리 입력
- 9-3. 타임 아웃 처리 입력, 한 번 더
- 9-4. 내가 루트인가?
- 9-5. arglist: $* 과 $@ 로 인자를 나열하기
- 9-6. 일관성 없는 $*과 $@의 동작
- 9-7. $IFS 가 비어 있을 때 $*와 $@
- 9-8. 밑줄 변수(underscore variable)
- 9-9. 그래픽 파일을 다른 포맷 확장자로 이름을 바꾸면서 변환
- 9-10. 매개변수 치환과 : 쓰기
- 9-11. 변수의 길이
- 9-12. 매개변수 치환에서의 패턴 매칭
- 9-13. 파일 확장자 바꾸기:
- 9-14. 임의의 문자열을 파싱하기 위해 패턴 매칭 사용하기
- 9-15. 문자열의 접두, 접미어에서 일치하는 패턴 찾기
- 9-16. declare를 써서 변수 타입 지정하기
- 9-17. 간접 참조
- 9-18. awk에게 간접 참조를 넘기기
- 9-19. 랜덤한 숫자 만들기
- 9-20. RANDOM 으로 주사위를 던지기
- 9-21. RANDOM 에 seed를 다시 지정해 주기
- 9-22. C 형태의 변수 조작
- 10-1. 간단한 for 루프
- 10-2. 각 [list] 항목이 인자를 두 개씩 갖는 for 문
- 10-3. Fileinfo: 변수에 들어 있는 파일 목록에 대해 동작
- 10-4. for 문에서 파일 조작하기
- 10-5. in [list]가 빠진 for 문
- 10-6. for 문의 [list]에 명령어 치환 쓰기
- 10-7. 이진 파일에 grep 걸기
- 10-8. 특정 디렉토리의 모든 바이너리 파일에 대해 원저작자(authorship)를 확인 하기
- 10-9. 디렉토리에 들어 있는 심볼릭 링크들을 나열하기
- 10-10. 디렉토리에 들어 있는 심볼릭 링크들을 파일로 저장하기
- 10-11. C 형태의 for 루프
- 10-12. 배치 모드로 efax 사용하기
- 10-13. 간단한 while 루프
- 10-14. 다른 while 루프
- 10-15. 다중 조건 while 루프
- 10-16. C 형태의 문법을 쓰는 while 루프
- 10-17. until 루프
- 10-18. 중첩된 루프
- 10-19. 루프에서 break와 continue의 영향
- 10-20. 여러 단계의 루프에서 탈출하기
- 10-21. 더 상위 루프 레벨에서 계속하기(continue)
- 10-22. case 쓰기
- 10-23. case로 메뉴 만들기
- 10-24. case용 변수를 만들기 위해서 명령어 치환 쓰기
- 10-25. 간단한 문자열 매칭
- 10-26. 입력이 알파벳인지 확인하기
- 10-27. select로 메뉴 만들기
- 10-28. 함수에서 select를 써서 메뉴 만들기
- 11-1. printf가 실제로 쓰이는 예제
- 11-2. read로 변수 할당하기
- 11-3. read로 여러줄의 입력 넣기
- 11-4. read를 파일 재지향과 같이 쓰기
- 11-5. 현재 작업 디렉토리 변경하기
- 11-6. let으로 몇 가지 산술 연산을 하기.
- 11-7. eval의 효과 보여주기
- 11-8. 강제로 로그 아웃 시키기
- 11-9. "rot13" 버전
- 11-10. 위치 매개변수와 set 쓰기
- 11-11. 변수를 "언셋"(unset) 하기
- 11-12. export를 써서, 내장된 awk 스크립트에 변수를 전달하기
- 11-13. getopts로 스크립트로 넘어온 옵션과 인자 읽기
- 11-14. 데이타 파일 "포함하기"
- 11-15. exec 효과
- 11-16. 작업을 계속 해 나가기 전에 프로세스가 끝나길 기다리기
- 12-1. CDR 디스크를 구울 때 ls로 목차 만들기
- 12-2. Badname, 파일 이름에 일반적이지 않은 문자나 공백 문자를 포함하는 파일을 지우기.
- 12-3. inode 로 파일을 지우기
- 12-4. 시스템 로그 모니터링용 xargs 로그 파일
- 12-5. copydir. xargs로 현재 디렉토리를 다른 곳으로 복사하기
- 12-6. expr 쓰기
- 12-7. date 쓰기
- 12-8. 스크립트에서 두 파일을 비교하기 위해 cmp 쓰기.
- 12-9. 낱말 빈도수 분석
- 12-10. 10자리 랜덤한 숫자 만들기
- 12-11. tail로 시스템 로그를 모니터하기
- 12-12. 스크립트에서 "grep"을 에뮬레이트 하기
- 12-13. 목록에 들어 있는 낱말들의 유효성 확인하기
- 12-14. toupper: 파일 내용을 모두 대문자로 바꿈.
- 12-15. lowercase: 현재 디렉토리의 모든 파일명을 소문자로 바꿈.
- 12-16. du: 도스용 텍스트 파일을 UNIX용으로 변환.
- 12-17. rot13: 초허접(ultra-weak) 암호화, rot13.
- 12-18. "Crypto-Quote" 퍼즐 만들기
- 12-19. 파일 목록 형식화.
- 12-20. column 으로 디렉토리 목록을 형식화 하기
- 12-21. nl: 자기 자신에게 번호를 붙이는 스크립트.
- 12-22. cpio로 디렉토리 트리 옮기기
- 12-23. rpm 아카이브 풀기
- 12-24. C 소스에서 주석을 제거하기
- 12-25. /usr/X11R6/bin 둘러보기
- 12-26. basename과 dirname
- 12-27. 인코드된 파일을 uudecode하기
- 12-28. 저당에 대한 월 상환액(Monthly Payment on a Mortgage)
- 12-29. 진법 변환(Base Conversion)
- 12-30. 다른 방법으로 bc 실행
- 12-31. seq로 루프에 인자를 만들어 넣기
- 12-32. 키보드 입력을 갈무리하기
- 12-33. 파일을 안전하게 지우기
- 12-34. m4 쓰기
- 13-1. 지움 글자(erase character) 세팅하기
- 13-2. 비밀스런 비밀번호: 터미널 에코 끄기
- 13-3. 키누름 알아내기
- 13-4. pidof 로 프로세스를 죽이기
- 13-5. CD 이미지 확인하기
- 13-6. 한 파일에서 한번에 파일 시스템 만들기
- 13-7. 새 하드 드라이브 추가하기
- 13-8. killall, /etc/rc .d/init.d 에서 인용
- 16-1. exec으로 표준입력을 재지향 하기
- 16-2. 재지향된 while 루프
- 16-3. 다른 형태의 재지향된 while 루프
- 16-4. 재지향된 until 루프
- 16-5. 재지향된 for 루프
- 16-6. 재지향된 for 루프(표준입력, 표준출력 모두 재지향됨)
- 16-7. 재지향된 if/then 테스트
- 16-8. 이벤트 로깅하기
- 17-1. dummyfile: 두 줄짜리 더미 파일 만들기
- 17-2. broadcast: 로그인 해 있는 모든 사람들에게 메세지 보내기
- 17-3. cat으로 여러 줄의 메세지 만들기
- 17-4. 탭이 지워진 여러 줄의 메세지
- 17-5. Here document에서 매개변수 치환하기
- 17-6. 매개변수 치환 끄기
- 17-7. upload: "Sunsite" incoming 디렉토리에 파일 한 쌍을 업로드
- 17-8. "아무개"(anonymous) Here Document
- 20-1. 서브쉘에서 변수의 통용 범위(variable scope)
- 20-2. 사용자 프로파일 보기
- 20-3. 프로세스를 서브쉘에서 병렬로 돌리기
- 21-1. 제한된 모드로 스크립트 돌리기
- 23-1. 간단한 함수
- 23-2. 매개변수를 받는 함수
- 23-3. 두 숫자중 큰 수 찾기
- 23-4. 숫자를 로마 숫자로 바꾸기
- 23-5. 함수에서 큰 값을 리턴하는지 테스트하기
- 23-6. 큰 두 정수 비교하기
- 23-7. 사용자 계정 이름에서 실제 이름을 알아내기
- 23-8. 지역 변수의 영역(Local variable visibility)
- 23-9. 지역 변수를 쓴 재귀 함수
- 24-1. 스크립트에서 쓰이는 별칭(alias)
- 24-2. unalias: 별칭을 설정, 해제하기
- 25-1. "and list"를 써서 명령어줄 인자 확인하기
- 25-2. "and list"를 써서 명령어줄 인자를 확인하는 다른 방법
- 25-3. "or lists"와 "and list"를 같이 쓰기
- 26-1. 간단한 배열 사용법
- 26-2. 배열의 특별한 특성 몇 가지
- 26-3. 빈 배열과 빈 원소
- 26-4. 아주 오래된 친구: 버블 정렬(Bubble Sort)
- 26-5. 복잡한 배열 어플리케이션: 에라토스테네스의 체(Sieve of Erastosthenes)
- 26-6. 복잡한 배열 어플리케이션: 기묘한 수학 급수 탐색(Exploring a weird mathematical series)
- 26-7. 2차원 배열을 흉내낸 다음, 기울이기(tilting it)
- 28-1. 특정 PID와 관련있는 프로세스 찾기
- 28-2. 온라인 연결 상태
- 29-1. 쿠키 항아리를 숨기기
- 29-2. /dev/zero로 스왑 파일 세팅하기
- 29-3. 램디스크 만들기
- 30-1. 버그 있는 스크립트
- 30-2. test24, 버그가 있는 다른 스크립트
- 30-3. "assert"로 조건을 테스트하기
- 30-4. exit 잡아채기(Trapping at exit)
- 30-5. Control-C 가 눌렸을 때 깨끗이 청소하기
- 30-6. 변수 추적하기
- 32-1. 서브쉘 함정(Subshell Pitfalls)
- 34-1. 쉘 래퍼(shell wrapper)
- 34-2. 조금 복잡한 쉘 래퍼(shell wapper)
- 34-3. awk 스크립트 쉘 래퍼(shell wrapper)
- 34-4. Bash 스크립트에 내장된 펄
- 34-5. 하나로 묶인 Bash 스크립트와 펄 스크립트
- 34-6. 자신을 재귀적으로 부르는 스크립트
- 35-1. 문자열 확장
- 35-2. 간접 변수 참조 - 새로운 방법
- 35-3. 배열과 약간의 트릭을 써서 한 벌의 카드를 4명에게 랜덤하게 돌리기
- A-1. manview: 포맷된 맨 페이지를 보는 스크립트
- A-2. mailformat: 이메일 메세지를 포맷해서 보기
- A-3. rn: 간단한 파일이름 변경 유틸리티
- A-4. encryptedpw: 로컬에 암호화 되어 있는 비밀번호로 ftp 사이트에 파일을 업로드하는 스크립트
- A-5. copy-cd: 데이타 CD를 복사하는 스크립트
- A-6. days-between: 두 날짜 사이의 차이를 계산해 주는 스크립트
- A-7. behead: 메일과 뉴스 메세지 헤더를 제거해 주는 스크립트
- A-8. ftpget: ftp에서 파일을 다운로드 해 주는 스크립트
- A-9. password: 8 글자짜리 랜덤한 비밀번호 생성 스크립트
- A-10. fifo: 네임드 파이프를 써서 매일 백업해 주는 스크립트
- A-11. 나머지 연산자로 소수 생성하기
- A-12. tree: 디렉토리 구조를 트리 형태로 보여주는 스크립트
- A-13. 문자열 함수들: C 형태의 문자열 함수
- A-14. 객체 지향 데이타 베이스
- F-1. 샘플 .bashrc 파일
- G-1. VIEWDATA.BAT: 도스용 배치 파일
- G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전
관련링크
- http://jiny.kr/jiny/276 757회 연결
댓글목록
등록된 댓글이 없습니다.