본문 바로가기

Learning/└◆Shell Scripts

셸 스크립트 작성[중급편]

 

 

 

반복문

 

for 구문

[예제1] "for ~ in ~ do ~ done" 구문을 사용한 예제

 

 

 

 

[예제2] for 구문 간단한 예제

다음은 파일의 내용을 변수로 치환하여 다루는 방법의 예제이다.

 

 

주석은 읽지 않게.

 

 

 

[예제3] for 구문의 활용 예제

 

다른 스크립트에서 많이 사용될수 있는 부분을 쉘스크립트로 만들어서 명령어처럼 사용해 보자.

 

 

다음은 seq 명령어(새로 만들어진 명령어)를 다른 명령어에서 불러다가 쓰는 예이다.

 

 

 

while 구문

 

vi ~/.vimrc

 

[TERM1]

# vi systeminfo.sh

 

[TERM2]

# cat /proc/cpuinfo

processor , model name 만 따로출력하기

# cat /proc/cpuinfo | egrep '(processor|model name)'

memory 만 따로 출력하기

# top -n 1 | grep 'Mem:'

용량 출력

# kdisk -l | grep Disk

 

[TERM1]

alias run='/root/bin/systeminfo.sh' 편집 중간중간 출력내용 확인

 

 

 

 

 

[예제1] "while ~ do ~ done" 구문 사용 예

count 값을 증가 시켜 가면서 하나씩 출력하는 예제이다.

 

[참고] while ~ do ~ done 구문의 활용

(웹 데몬의 개수를 모니터링)

# while [ 1 ]

> do

> ps -ef | grep httpd | wc -l | tee -a file.log

> sleep 3

> done

 

(telnet 서버에 접속한 원격호스트 수 모니터링)

# while true

> do

> netstat -an | grep EST | grep 172.16.8.XXX.23 | wc -l

> sleep 3

> done

 

# while :

> do

> netstat -an | grep EST | grep 172.16.8.XXX.23 | wc -l

> sleep 3

> done

 

 

 

[예제2] while 구문과 shift 사용 예

shift를 사용하여 프로그램 인자를 하나씩 주여 가면서 출력하는 예제이다.

 

 

 

 

[예제3] 입력한 이름이 맞을때까지 계속 동작하는 예제이다.

 

 

 

EX)quiz.sh

수정본

 

완성본

[Kali]

# msfconsole

 

[TERM1]

 

 

반복구문 추가 (다시 명령 프롬프트를 실행시키기 위함)

 

만들어보기

 

 

 

 

 

루프제어

 

 

shift 명령어

 

 

 

 

 

break 명령어

 

루프를 즉시 탈출하고자 하는 경우에 사용, 무한 루프의 탈출에 유용

 

 

 

continue 명령어

 

continue 명령어는 지정한 조건이 참이면 제어 루프의 시작으로 되돌린다.

 

 

 

[예제1] yes 입력시 계속 입력 받기

다음 스크립트는 yes 라고 입력하면 계속 입력을 받고 다른 값을 입력하면 수행을 끝낸다

 

 

 

 

[예제] continue를 사용하는 다른 예제

 

cmp file1 file3 ; echo$? 1 일때

cmp file1 file3 >/dev/null 2>&1 = cmp -s file1 file3    출력 하지 않기

 

# nohup /root/bin/script.sh & (# nohup CMD)

 

 

(기능)

목적: 로그 파일을 모니터링 하는 프로그램 작성

기능:

로그 파일의 추가된 내용을 확인

로그 파일의 추가된 내용이 존재한다면 메일로 전송(To: root)

이 프로그램은 종료되면 안된다.(EX: Daemon)

 

단점:

정상적인 추가 내용은 확인할 수 있지만 에러 메세지 확인 유무 불가능.

 

응용 제작

에러 메세지가 있을 때 확인하는 스크립트.

.tmp1 과 .tmp2를 비교 해서 틀린 내용이 있을 때 .tmp3에 저장하고 메일로 전송

 

확인 ./script.sh

# logger -p "local0.norice" "hello warning"

# tail /var/log/messages

# mailx

 

 

 

I/O 리다이렉션과 자식 쉘

 

파이프나 리다이렉션을 이용하면 파일에서 루프로 입력을 전환할 수 있다.

같은 방법으로 출력 역시 루프에서 파일로 지정할 수 있다.

입출력 리다이렉션이나 파이프를 처리하기 위해서는 자식 쉘을 실행시켜야 한다.

루프 내에서 정의한 변수들은 스크립트의 나머지에서 참고 할 수 없다.

 

 

[예제1] I/O 리다이렉션을 통해 자식 쉘을 사용하는 경우의 예

 

done > tmp$$

while do done 내용이 tmp$$에 저장

 

 

 

시그널 트래핑

어떤 상황에서는 시그널에 대해 바로 종료하면 곤란한 경우가 생길 수 있다.

사용자가 이런 시그널에 대해 적절한 동작을 지정해 줄수 있다.

, 시그널을 무시해 버리거나, 필요한 몇몇 작업을 처리하고 종료하도록 설정하는 것이다.

trap 명령어는 시그널에 대해 적절한 대처 방법을 설정 할 때 사용한다.

 

# kill -9 CMD

# whatis signal

trap 명령의 사용범위는 다양하다.

시그널이 도착하면 특정한 동작을 하고 종료한다.

특정한 시그널이 오면 무시한다.

특정한 시그널이 오면 트랩 메시지를 출력한다.

trap 'rm tmp* ; exit 1' 1 2 15

위의 예는 1, 2, 15 시그널이 도착하면 모든 tmp 파일을 지우고 종료한다.

 

trap " " 1 2

위의 예는 1 2 시그널이 오면 무시된다. trap 명령어 다음에 한쌍의 빈 따옴표가 오면 뒤에 나열한 시그널이 무시된다.

 

trap 'echo "Control-C will not terminate $0."' 2

trap 'echo "Control-will not terminate $0."' 3

위의 예는 2 3 시그널이 오면 트랩 메세지를 출력하고 프로그램을 종료하지 않는다.

 

시그널을 기본값으로 재설정하기 위해서는 trap 명령어 다음에 시그널 이름이나 번호만 지정한다. 다음예는 2 3 시그널을 기본값으로 재설정하는 예이다.

trap 2 3

 

 

 

 

 

디버깅 (자세히출력)

bash -x

bash +x

# sh -x script_file (# bash -x script_file)  실행되고 있는 것 출력

# sh -xv script_file (# bash -xv script_file) 원본 내용까지 출력

 

 

 

 

 

 

 

 

 

http://jonghyunkim816.blogspot.kr/2013/10/755.html