반응형
<쉘 스크립트>
- 스크립트(자바스크립트, 펄스크립트, 우라스크립트, 파이썬...)
- 컴파일을 통해 실행파일을 만드는 것이 아니라 인터프리터에 의해 실행
- 컴파일 언어보다 구조가 쉬워 빨리 배울 수 있음
- 다른 프로그램을 통해 실행되므로 컴파일 언어보다 실행 시간이 오래 걸림
- 쉘 스크립트 파일 이름은 스크립트 기능 및 어느 쉘인지 알 수 있도록
- 앨리어스, 내장 명령, 함수 키워드가 실행되지 않도록 파일명 작성
- 실행 순서 : 앨리어스 -> 키워드 -> 함수 -> 내장명령 -> 스크립트, 유닉스 명령, 유틸리티
<쉘 스크립트 실행 / 종료>
- 권한 부여 후 경로 설정하여 실행
- 쉘 통해 실행(bash 파일명)
- 파일내에서 exit (숫자) 명령을 만나면 종료 (숫자는 $?에 저장됨)
<스크립트 파일 구성요소>
- #!(매직넘버) : 현재 스크립트를 처리할 프로그램(인터프리터) 지정(#!/bin/bash, #!/bin/more, ...)
- 일반적인 유닉스 명령어만 사용한다면 쉘 지정하지 않아도 됨
- # : 주석문
- 쉘 명령 : 모든 쉘 명령을 스크립트 내용으로 사용 가ㅡㅇ
- 쉘 프로그램 : 쉘에서 제공하는 프로그램들
- 쉘 변수, 각종 연산자, 제어문 등등
<쉘 변수>
- 변수명=값 : 정의와 동시에 값 저장
- ${변수명} : 변수명 값으로 대치
- ${변수명:-문자열} : 변수가 정의되어 있으면 해당 값을, 아니면 문자열을 사용
- ${변수명:=문자열} : 변수가 정의되지 않았거나 널이면 문자열 사용(변수 값은 문자열로 대체 됨), 그렇지 않으면 대체X
- $(변수명:+문자열} : 변수가 정의되어 있고 널이 아니면 문자열 사용, 그렇지 않으면 대체 안 됨
- ${변수명:?문자열} : 변수가 정의되어 있고 널이 아니면 해당 값을, 그렇지 않으면 문자열을 출력하고 쉘 종료
- 쉘 변수 일부 문자열 제거
- ${문자열%패턴} : 문자열 뒤부터 패턴과 일치하는 가장 작은 부분 제거
- ${문자열%%패턴} : 문자열 뒤부터 패턴과 일치하는 가장 큰 부분 제거
- *을 붙여야 일치하는 최대 부분 제거하기 용이(뒤에 붙은 문자열까지)
- ${문자열#패턴} : 문자열 앞부터 패턴과 일치하는 가장 작은 부분 제거
- ${문자열##패턴} : 문자열 앞부터 패턴과 일치하는 가장 큰 부분 제거
- 마찬가지로 /을 붙이면 마지막에 나오는 파일 이름만 알아낼 수 있음
- ${#문자열} : 해당 값의 문자 수 출력
- 포지션 인자
- 스크립트를 실행할 때 인자를 전달하면 수서대로 주어진 인자를 저장
- $0 : 현재 쉘 스크립트의 이름
- $1 ~ $9 : 명령행에서 전달 받은 첫번째 ~ 아홉번째 포지션 인자
- ${10} : 10번째 포지션 인자
- $# : 전체 포지션 인자 개수
- $* : 모든 포지션 인자
- $@ : $*과 동일
- "$*" : "$1 $2 $3 ..."을 하나의 문자열로 취급
- "$@" : "$1" "$2" "$3" ... 으로 각각 독립적인 문자열로 취급
- $? : 최근 실행된 명령의 종료 값(exit, return을 통해)
- set -- : 모든 포지션 인자들을 삭제/설정 해제
- 명령 대체
- ``(백쿼터) 이외에 $(명령)도 지원함
<사용자에게 입력 받기>
- read 변수명 : 표준 입력으로 한 행을 입력 받아 변수에 저장
- read 변수명1 변수명2 : 표준 입력으로 한 행을 입력 받아 첫 번째 단어를 변수1에 나머지를 변수2에 저장
- read -p 문자열 : 문자열을 프롬프트로 출력시키고 입력 받아 REPLY변수에 저장
- 명령 << 문자열 : 키보드 입력의 EOF(^D)와 달리 해당 문자열이 나올 때까지의 모든 문자열을 입력으로 처리
<연산자>
- 수치 연산자(let 내장 명령 또는 (()) 사용)
- - : 음수(단항 연산) ex: a=-3
- ! : 논리 부정(not) ex: ((!a>b))
- ~ : 비트 반전(not) ex: ~a
- *, /, & : 곱셈, 나눗셈, 나머지 연산 ex: let a=5*2
- +, - : 덧셈, 뺄셈 ex: let a=4+b
- <<, >> : 시프트 연산 ex: ((a = b<<1))
- <=, >=, <, >, ==, != : 비교 연산 ex: ((a == b))
- &, ^, \ : 비트 and, xor, or 연산 ex: let "a = b^c"
- &&, || : 논리 and, or 연산 ex: ((a<b || a<c))
- = : 변수 값 지정 ex: let a=1
- *=, /=, %=, +=, ==, <<=, >>=, &=, ^=, |= : 단축 연산
- (())안에서 = 좌우는 공백 가능하지만 let을 쓸땐 ""로 묶어줘야 함
<제어문>
- if문 : 결과 값이 0일때 명령 실행(결과 값이 0이면 종료 값이 1, 0이 아니면 종료 값이 0이다)
- if 조건명령
then
명령 - 문자열 연산자
- 문자열 = 패턴 : 서로 일치하는지(=사이에 공백 있어야 함)
- 문자열==패턴 : 서로 일치하는지
- 문자열 != 패턴 : 서로 일치하지 않는지(!= 사이에 공백 있어야 함)
- 문자열 : 문자열이 널이 아닌지
- -z 문자열 : 문자열의 길이가 0인지
- -n 문자열 : 문자열의 길이가 0이 아닌지
- -l 문자열 : 문자열의 길이
- ex: if [[ $x = [0-9]* ]]
명령)
else
명령))
fi</p>
<case 문>
- case 변수 in
값1)
명령;;
값2)
명령;;
*)
명령;;
esac - 값으로 | 연산자나 특수기호(범위 등등) 지정 가능
- 일치하는 값이 없으면 *) 부분 실행
<for 문>
- for 변수 in 리스트
do
명령
done - 변수를 리스트의 각 값들로 지정해서 do-done 구간 반복
- $(< 파일명)을 리스트로 사용해서 외부 파일 참조 가능(단어 한 개씩 처리)
- 당연히 스크립트 명령행 인자를 리스트로 사용 가능(ex: $*)
<while 문> : 구간이 반복 될때마다 조건명령을 실행해서 종료 값이 0이면 반복
- while 조건명령
do
명령
done - 산술, 비교, 논리 연산자를 이용할때 (()) 또는 let을 사용해서 오류 / 무한 루프 방지(^C로 종료)
<until 문> : 조건명령이 정상 실행될 때까지 반복(while과 반대)
- untile 조건명령
do
명령
done
<select 문> : 리스트 값들에 순서대로 번호를 붙여 출력함(번호를 입력 받음)
- select 변수 in 리스트
do
명령
done - 선택된 값(숫자)은 REPLY에 저장 되고 해당 명령은 cmd에 저장 됨
- PS3 값이 사용자 입력을 위한 프롬프트로 사용됨
- REPLY가 널일 때만 프롬프트(PS3 값)이 출력되므로 계속 출력 시키려면 반복 될때마다 REPLY를 널로 설정해야함(REPLY=)
<continue> : 루프의 처음으로 돌아감
- 중첩된 루프문의 경우 continue를 포함하고 있는 루프의 처음으로 돌아감
<함수>
- 스크립트 안에서 정의해 사용할 수 있고, 사용자 초기화 파일에 정의할 수도 있다(명령 처럼 사용).
- function 함수명
{
명령
} - typeset -f : 함수목록 출력
- 일바 명령 쓰듯이 인자 전달(공백으로 구분, $* 등으로 활용)
- return 변수 : 함수 종료 값 지정($? 변수에 저장 됨)
- (ex: return $2)
- unset -f 함수명 : 함수 삭제
<디버깅>
- bash -x 함수명 : 스크립트의 각 행이 실행될 때마다 화면에 출력(+로 시작하는게 스크립트의 각 행)
- trap '명령' DEBUG : trap을 포함한 스크립트를 한 행씩 실행할 때마다 명령 실행(주로 변수 변화 확인)
- DEBUG시그널을 받을 때마다 명령 실행
- DEBUG : 스클비트의 명령이 실행 될 때마다 생성되는 시그널
반응형
'유닉스, 리눅스' 카테고리의 다른 글
[유닉스/리눅스 기초] ctags (소스 분석, 태그 검색) (0) | 2016.09.13 |
---|---|
[유닉스/리눅스 기초]시스템 관리(솔라리스 11) (0) | 2016.09.13 |
[유닉스/리눅스 기초]유틸리티 (0) | 2016.09.13 |
[유닉스/리눅스 기초]통신 (0) | 2016.09.13 |
[유닉스/리눅스 기초]파일 아카이브 및 압축 (0) | 2016.09.13 |
댓글