반복문
■ 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
'Learning > └◆Shell Scripts' 카테고리의 다른 글
MAC 충돌 점검 프로그램 작성 (0) | 2017.01.07 |
---|---|
셸 스크립트 작성[실무편]-상 (0) | 2016.12.14 |
셸 스크립트 작성[초급편] (0) | 2016.12.14 |
쉘 스크립트 코드 분석 (0) | 2016.12.14 |