-- Title : [Lnx] Bash Shell Script
-- Reference : lsit81.tistory.com
-- Key word : linux centos bash shell script 쉘스크립트 echo 줄바꿈 줄 바꿈
********************************************************************************************/
참조 : http://lsit81.tistory.com/117에서 워낙 정리가 잘 되어 퍼옴.
Shell Script 란?
Wikipedia에 다음과 같이 정리되어 있습니다.
셸 스크립트(shell script)는 셸이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영 체제를 위해 쓰인 스크립트이다. 단순한 도메인 고유 언어로 여기기도 한다. 셸 스크립트가 수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다. 셸 스크립트라는 말은 유닉스 셸을 위해 쓰인 스크립트를 말하는 반면, COMMAND.COM(도스)과 cmd.exe (윈도) 명령 줄 스크립트는 보통 배치 파일이라고 불리지만 이 글에는 두 개의 속성 모두를 논한다. |
종류
bash, ksh, sh, csh, …
Shell Script를 공부하면 좋은 점.
- C/C++ Open Source의 경우 make 파일을 제공하고 있으며 이때 만드는 makefile도 하나의 스크립트로 볼 수 있으며, makefile내에서도 위부 스크립트를 실행하는 로직이 포함되기도 합니다.
- 리눅스 계열의 OS를 공부하실때 스크립트가 많은 도움됩니다.
- 스크립트를 이용하여 자동 빌드 배포 시스템 같은 것도 만들 수 있습니다.
현재 시스템에서 사용중인 Shell 확인
Shell Script 생성
vi와 같은 에디터를 통해서 shell script를 작성 합니다.
일반적으로 쉘 스크립트는 .sh 확장자를 사용합니다.
실행 Permission
- Shell Script를 실행하기 위해선 실행 Permission을 부여해야 합니다.
Shell Script 실행
- 절대 경로 혹은 상대 경로로 실행합니다.
Shell Script의 기본
쉘 스크립트 작성.
일반적으로 스크립트 첫번째 줄에 “#!bin/sh”을 넣어 줍니다.
이는 bash shell이라는 것을 명시적으로 알려주는 것이며, 생략 가능합니다.
* 주의
- 생략 가능하나 그럴 경우 시스템의 default shell이 사용됨.
- Shell 종류에 따라 command 및 사용법이 조금씩 다르므로, 명시적으로 선언하지 않을 경우 runtime 오류가 발생 가능합니다.
주석
“#”으로 시작하는 Line은 주석으로 인식합니다.
* 샘플
#!/bin/bash |
사용자 변수
기본적으로 “변수명=값” 와 같은 형태로 작성한다.
변수명에 값을 할당할 때 공백을 넣지 않는다.
대소문자 구분
변수명에 ? * 문자는 사용 금지
명시적 변수 선언
declear 또는 typeset 명령 사용 (bash에서만 사용 가능)
옵션
‘-i’ : 정수
‘-a’ : 배열
‘-f’ : 함수
‘-r’ : 읽기 전용
‘-x’ : Shell 외부에서 사용 가능 변수
* 샘플
#!/bin/bash #변수명과 텍스트를 붙여쓰고 싶은 경우 echo “텍스트"$변수명"텍스트 |
시스템 변수
변수명 |
설명 |
BASH |
쉘 이름 |
BASH_VERSION |
쉘 버젼 |
COLUMNS |
컬럼 |
LINES |
라인 |
HOME |
홈 디렉토리 |
LOGNAME |
로그인 명 |
OSTYPE |
OS 타입 |
PATH |
패스 설정 값 |
PS1 |
prompt 설정 값 |
PWD |
working 디렉토리 |
SHELL |
쉘 이름 |
USERNAME |
현재 로그인된 유저 ID |
특수 문자
변수 |
의미 |
$? |
마지막으로 실행된 명령어가 돌려주는 최종 값 (0이면 성공, 그렇지 않으면 실패) |
$$ |
현재 수행 중인 프로세스의 프로세스 ID |
$! |
Shell이 수행시킨 마지막 백그라운드 프로세스의 ID |
$- |
Shell로 넘겨진 flag |
$_ |
Shell이 가동될 때 Shell에 전달된 flag 또는 set 명령을 사용해 지정된 flag |
$# |
Shell이 입력받은 전체 매개변수의 개수 |
$* |
한 낱말로 표시되는 전체 위치 매개변수 들 |
$@ |
$*과 동일하지만 각 매개변수는 quote되어 문자열로 취급됨 |
$0 |
Shell의 이름 |
$1, $2, …$n |
매개변수 |
ex1) 외부 프로세스 실행 후 결과 확인
ex2)
이스케이프(escape) 문자
- \와 하나의 문자로 구성. 화면에 표시되지 않고 특수한 의미를 지님.
변수 |
의미 |
\a |
경고음 |
\b |
백 스페이스 |
\n |
개행 |
\t |
수평 탭 |
\v |
수직 탭 |
\\ |
‘\’ 문자 표시 |
\? |
‘?’ 문자 |
\’ |
작은 따움표(‘) |
\” |
큰 따움표 (“) |
Shell Scrip 명령문.
echo 커멘드 옵션
echo [옵션] [텍스트, 변수 등]
옵션
-n 출력 후 줄바꿈 안함.
- -e 다음과 같은 문자를 텍스트에서 사용 가능하게 한다.
연산 (계산식)
expr 값1 연산자 값2
해당 공식을 계산해서 화면에 출력한다.
quote 출력 규칙
“ |
\, $ 문법 사용이 가능 |
‘ |
\, $ 문법을 무시하고 그대로 출력 |
` |
`안에 있는 커맨드를 실행하여 출력. |
ex) quote test
입력값 받기
read 변수
사용자로부터 입력값을 받는 명령어 이다.
ex)
매개변수
함수를 호출할 때나, 쉘 스크립트 파일을 실행할 때 뒤에 띄어쓰기로 구분하여 매개 변수를 전달 할 수 있습니다.
예제 |
설명 |
$0 |
쉘 스크립트 이름 |
$# |
매개 변수의 개수 |
$* |
매개 변수들을 모아놓은 문자열 |
$1 ~ $n |
매개 변수 |
ex) ./test_parameter.sh 123 computer 실행시
결과 :
변수 내용 조작하기
예제 |
설명 |
${variable:-default} |
변수가 존재하지 않으면 default로 대체 |
${#variable} |
variable의 length를 얻는다. |
${variable%word} |
variable의 끝에서부터 word와 첫번째로 일치하는 부분을 제거한다. |
${variable%%word} |
variable의 끝에서부터 word와 마지막으로 일치하는 부분을 제거한다. |
${variable#word} |
variable의 시작에서부터 word와 첫번째로 일치하는 부분을 제거한다. |
${variable##word} |
variable의 시작에서부터 word와 마지막으로 일치하는 부분을 제거한다. |
word에는 와일드카드(*)를 사용할 수 있습니다.
ex)
배열
Shell Script 종료
exit 반환값
exit 명령을 만나면 수행중인 shell script를 종료합니다.
반환 값이 0이면 성공적으로 shell script를 종료한 것이며, 그렇지 않으면 실패한 것입니다.
Shell Script 제어문
비교 연산
- 산술 비교 조건
- 문자열 비교 조건
- 파일 비교 조건
- AND, OR 조건
AND, OR 조건은 다음과 같은 형태로 사용 가능합니다.
if 문
case 문
for 문
while 문
Functions
쉘 스크립트에서는 다음과 같이 함수를 만들어 사용할 수 있습니다.
주요 Command...
자주 사용되는 몇 가지 명령들에 대하여 간략히 설명드립니다.
자세히 알고 싶은 경우 man 명령을 통해서 살펴보시기 바랍니다.
grep 명령
정규 표현식에 매치하는 문자열을 찾아서 해당 행만을 출력.
문법
grep [옵션] <찾을 문자열 정규 표현식> [대상 파일명]
옵션
‘-i’ : 소문자와 대문자를 구분하지 않고 검색
‘-c’ : 매치하는 행 수만을 리턴
‘-w’ : 단어 단위로 패턴을 검색
‘-v’ : 검색 패턴에 매치하는 내용이 없는 행만 리턴
‘-n’ : 라인 번호를 붙여서 리턴
ex)
# grep -n '^jack:' /etc/passwd
(/etc/passwd 파일에서 jack을 찾는다. jack이 행의 맨 앞에 있으면 행 번호를 화면으로 출력한다.)
종료 상태 :
grep은 파일 검색의 성공 여부를 종료 상태값으로 되돌려준다.
패턴을 찾으면 0, 패턴을 찾을 수 없으면 1, 팡리이 존재하지 않을 경우 2
출처 : http://korcow.egloos.com/1854945
awk 명령
열 단위로 정리되어 있는 텍스트 파일에서 데이터를 뽑아낼 때 사용.
문법
awk <pattern> { action }
-F
필드 구분자 이다.
Action
액션은 문장(statements)으로 이루어져 있다. 액션은 간단하게 상수 하나로 이루어질 수도 있고, 개행 문자나 세미콜론(;)에 의해 분리된 몇 개의 문장의 연속으로 구성될 수도 있다.
print : 특정 규칙에 맞게 데이터를 화면에 출력한다.
$1, $2 … $n : 필드 번호
$NF : 마지막 필드
예제
awk -F ':' '{ print $1 }' filename // 입력 필드를 ':'로 구별
awk -F "[ :]" '{ print $1 $2 }' filename // 스페이스와 ':'로 입력 필드 구별
awk ‘/aaa/’ filename // aaa라는 단어가 있는 라인 출력
awk ‘^aaa/’ filename // aaa로 시작하는 라인 출력
awk ‘/^(aa | bb)/’ filename // aa 또는 bb로 시작하는 라인 출력
참고 : http://www.dreamy.pe.kr/zbxe/CodeClip/6332
cut 명령
텍스트 또는 문장에서 하나 이상의 부분을 제거.
문법
cut [옵션] [파일]
옵션
-c : 지정한 컬럼 출력
-f : 지정한 필드 출력
-d : 구분자(delimiter). -f 옵션과 함께 사용.
예제
root@ls ]# cut -c 2-5 /etc/passwd
/etc/passwd 파일의 2번째부터 5번째 문자까지를 출력한다
[root@ls ]# cut -f 3 anaconda-ks.cfg
anaconda-ks.cfg 파일의 3번째 필드를 출력한다. 필드 구분은 tab이다.
[root@ls ]# cut -f 2 -d : /etc/passwd
/etc/passwd 파일의 2번째 필드를 출력한다. 필드 구분은 ‘:’이다.
sed 명령
비 대화모드의 라인 단위 편집기
문법
sed [옵션] [sed 명령어] [파일]
치환 (substitute) : 원본 파일을 바꾸지 않고 출력을 바꿔서 한다.
sed ‘s/대상 정규식 패턴/바꿀 문자열' filename : 제일 처음 나오는 것을 switch
sed ‘s/대상 정규식 패턴/바꿀 문자열/g' filename : 모든(global)에서 switch
ex 1) filename에서 제일 처음 나오는 aaa를 bbb로 치환
sed ‘s/aaa/bbb’ filename
ex 2) filename에서 모든 aaa를 bbb로 치환.
sed ‘s/aaa/bbb/g’ filename
찾기, 출력
sed -n ‘/정규식 패턴/p’ filename
-n : 읽은 것을 출력하지 않음
/p : 해당 라인을 출력
삭제
sed '/TD/d' 1.html : TD 문자가 포함된 줄을 삭제하여 출력한다.
sed '/Src/!d' 1.html : Src 문자가 있는 줄만 지우지 않는다.
sed '1,2d' 1.html : 처음 1줄, 2줄을 지운다.
sed '/^$/d 1.html : 공백라인을 삭제하는 명령이다
참고 :
shell script 정리 : http://www.insford.com/wiki/Wiki.jsp?page=Shell%20Script