검색결과 리스트
글
리눅스 shell 작성하기
쉘 스크립트 작성하기 스크립트의 특징 중의 하나는 그 내용이 텍스트 형식이기 때문에 일반 편집기로 볼 수 있다는 것이다. 위에서 찾는 스크립트 중 아무 것이나 cat, vi, emacs 등으로 보아라. 여러 명령들과 스크립트 문법의 조합으로 되어 있는 것을 확인할 수 있다. 스크립트의 가장 첫줄은 항상 #!로 시작한다. #! 다음에는
이 스크립트를 실행할 인터프리터와 그 실행 옵션을 지정한다. 쉘 스크립트에서는 #!/bin/sh, #!/bin/csh, #!/bin/bash, #!/bin/ksh, #!/bin/tcsh와
같이 쉘의 절대 경로를 써준다. 전통적인 관습에 의하여 #!만
써줄 경우에는 #!/bin/sh로 인식을 한다. 이제 앞의 예제를 바탕으로 간단한 ‘findscript’ 쉘 스크립트를 작성하여 보자. 이 스크립트는 /bin, /usr/bin에서 쉘 스크립트를 찾아 보여준다.
cat 또는 다른 편집기를 이용하여 위에서 처럼 작성을 하고, 실행 가능하도록 퍼미션을 준다. 그리고서 다른 프로그램 처럼 실행을 하면 된다. 위에서 본 것과 같이 기본적으로 쉘 스크립트는 쉘에서 사용할 수 있는 명령들의 집합이다. 여기에 덧붙여 쉘에서는 쉘 스크립트에서 사용할 수 있는 나름의 문법을 제공한다.
종료 상태 (Exit status) 각 명령들은 실행을 올바로 마치고 정상적인 종료(성공/참)하거나, 실행 오류 또는 인터럽트에 의한 중단과 같은 이유로 비정상적으로 종료(실패/거짓)할 수 있다. 이 성공과 실패는 명령의 종료 상태값으로 알 수 있다. 보통 0은 성공을 나타내며, 0이 아닌 값은 실패를 나타낸다. 쉘에서는 이전에 실행한 명령이 성공을 하였는지 실패를 하였는지를 ? 변수값에 저장을 한다.
false 명령은 항상 1, 실패의 종료 상태를 반환하고 true 명령은 항상 0, 성공의 종료 상태를 반환한다. 쉘 스크립트에서는 exit를 이용하여 스크립트를 종료하면서 종료 상태를 반환할 수 있다. exit만을 사용하면 쉘 스크립트를 종료하고 가장 마지막에 실행한 명령의 종료 상태를 반환하고, exit <숫자>를 사용하면 종료하고 <숫자> 값을 쉘에 반환한다.
if 구문은 조건식에 따라서 분기를 한다. if 조건식 if의 조건식이 참이면, 즉 0을 반환하면 then 다음의 명령들을 수행하고, 거짓이면, 즉 0이 아닌 값을 반환하면 (대개 1이다) else 다음의 명령을 수행한다. elif는 if의 조건식이 거짓이 될 경우에 분기되어 다시 새로운 조건식을 검사한다. elif나 else 구문은 생략이 가능하다. fi는 if 구문의 끝은 나타낸다. (fi는 if를 거꾸로 쓴 것이다. :-)) 위의 예제 스크립트에서 if 조건문의 [ $# -eq 0 ]는 스크립트의 인자의 갯수($#)가 0과 같은지(-eq)를 검사하는 것이다. 인자가 없다면 exit를 수행하고 마지막으로 수행한 명령인 조건식의 종료 상태값 0을 반환하다. 인자가 있다면 else 구문에서 첫번째 인자 값을($1)을 종료 상태로 반환한다. 쉘 스크립트가 수행도중에 인터럽트를 받아서 비정상적으로 종료할 수도 있다. 이런 경우에는 임시로 사용한 파일을 삭제하는 것과 같은 정리 작업을 수행할 수 없게된다. 이를 방지하기 위한 trap 구문이 있다. 형식은 다음과 같다. trap ‘명령들’ [시그널 번호들] 인터럽트에 해당하는 시그널 번호를 써준다. 이 번호는 kill -l을 하면 알 수 있다.시그널 번호를 0을 쓸 경우는 쉘 스크립트가 정상적인 종료를 할 경우를 나타낸다. 아래의 쉘 스크립트를 수행하면 loop 라는 글씨가 화면에 계속 출력될 것이다. 여기서 사용된 while은 무한 루프를 돌게 된다. 루프에 대해서는 뒤에서 보겠다. 종료를 하기 위해서 Ctrl+C(SIGINT,2)를 누르더라도 이는 첫번째 trap 구문에
의해서 메세지만을 출력한다.
명령행 인자 (Command-line argument) 쉘 스크립트에서는 최대 9개의 명령행 인자를 받을 수 있다. 그 값은 $1~$9에 저장된다. (최신 쉘에서는 그 이상의 인자를 받을 수도 있다. ${10}과 같은 형식이다.) $0에는 실행한 쉘 스크립트의 경로가 저장된다. 또한 위에서 잠깐 보았듯이 $#에는 인자의 개수가 저장이 된다. 스크립트 중에 shift를 사용하였음을 주목하라. shift는 $1 인자를 없애고 각 인자번호를 1씩 줄인다. 즉 $2는 $1, $3은 $2, $4은 $3과 같은 식으로 된다.
그래서 shift한 이후에는 세번째 인자가 $2가 되는 것이다. 이때 $# 값도 1준다. 모든 인자는 “$@”, $*에 저장이 된다. “$@”는 명령행에서 사용한 따옴표가 그래도 적용되지만, $*에서는 그 따옴표가 적용되지 않는다. 따옴표에 유무에 따라서 쉘에서 사용하는 특수문자들 - 공백, 탭, \, ‘, “, ` 등 - 해석할 것인지의 여부가 결정이 된다. 이는 쉘을 사용하는 것에 관한 문제이기 때문에 더이상 자세히는 다루지 않겠다. $$에는 현재 쉘 스크립트의 프로세스 ID가 저장이 된다. 이는 명령행 인자는 아니지만 임시 파일을 만들 때와 같은 경우에 유융하게 사용된다.
루프 (Loop) 쉘 스크립트에서 사용할 수 있는 루프는 세 가지가 있다. while 조건식 while 루프는 조건식이 참인 동안 do~done 사이의 명령을 수행한다.
until 조건식 until 루프는 조건식이 참이 될 때까지 do~done 사이의 명령을 수행한다.
for 변수 in [문자열 목록]
for 루프는 문자열 목록의 값들이 for 변수에 지정되어 do~done 사이의 명령을 수행한다. in 부분을 생략하면 명령행 인자가 사용된다. break를 사용하면 루프를 빠져나온다. 루프는 아닌지만 C에서의 switch와 비슷한
역할을 하는 case구문이 있다. case 변수 in 변수값을 패턴1부터 비교해가면서 해당하는 패턴이 있으면 그에 해당하는 명령들을 수행한다. ;;은 패턴에 해당하는 명령의 끝을 나타내고 esac은 (case를 거꾸로 쓴 것이다.) case 구문의 끝을 나타낸다. 해당되는 패턴이 없다면 * 패턴의 명령을 수행하게 된다. 패턴에는 쉘에서 사용할 수 있는 와일드 카드(*,?), 정규표현식, 문자열, 변수가 올 수 있다.
조건식 if, while, until 구문에서는 조건식이 사용된다. 조건식은 참과 거짓의 결과를 내는 구문이다. 참일 경우 조건식은 0을 반환하고, 거짓일 경우에는 1을 반환한다. 조건식의 형식은 다음과 같다. test 식 식은 파일식, 문자열식, 수식의 세 종류로 크게 나눌 수 있다. :는 항상 참임을 나타낸다. while, until에서 무한 루프를 만들기 위해 사용된다. 파일식은 어떤 파일의 속성을 검사하는 것으로 다음과 같은 종류가 있다. -b 파일 : 파일이 블럭 장치 파일이면 참 문자열식은 문자열에 대한 비교를 한다. -z 문자열 : 문자열의 길이가 0이면 참 수식은 숫자값을 비교한다. 양의 정수, 음의 정수, 0, 변수값이 올 수 있다. 값1 -eq 값2 : 값1 = 값2 이외에도 다음과 같이 식 전체에 대한 연산이 가능하다. ! 식 : 식에 대한 부정(not)
결론 이번 기사에서는 쉘 스크립트에 대한 기본적인 사항들을 살펴보았다. 작성, 실행 방법과 기본적인 문법만으로도 간단히 개인적으로 유용하게 사용할 수 있는 스크립트를 작성할 수 있을 것이다. 다음 기사에는 각 세부 사항에 대한 자세한 설명과 기법에 대해서 알아도록 하자. <참고자료> |
|
|
'Linux' 카테고리의 다른 글
Linux Log 관리를 위한 logrotate 명령으로 로그 관리하기 (0) | 2015.10.20 |
---|---|
리눅스 Burute Force 공격에 대한 iptables 설정으로 방어하기 (0) | 2015.10.20 |
리눅스 중요 디렉토리(폴더) 정보 (0) | 2015.10.20 |
리눅스 디스크(파티션) 용량 확인 (0) | 2015.10.20 |
리눅스 zmodem 설치 및 사용 (0) | 2015.10.20 |