[BSS] BASH shell script 무작정 예제
BASH Shell Script 무작정 따라해 보기 입니다.
마음에 준비가 안되신 분들은 그냥 넘기셔도 상관 없습니다.
이어질 예제는 아래 사이트에 게시된 예제 입니다. BASH Shell Script을 더없이 완벽하게 다루고 있는데, 향후 이 사이트의 내용을 많이 다루게 될 듯 합니다. 초짜인 저도 이해 할 수 있을 정도로 쉬운 예제이니 같이 보시죠.
앗~ 본론으로 들어가기 전에 한 가지만 더 언급하도록 하겠습니다.
Team. LAMECH의 프로젝트를 진행 하면서 여러 사이트 또는 블로그에 올려진 글들은 많이 참고 합니다. 전에는 전~~~혀 정보전달을 목적으로 글을 쓴다는 것이 이렇게 어려운 일인지 몰랐습니다. 이 게시글을 빌어 여러 정보를 공유하여 주시는 분들께 감사의 인사를 드리고 싶습니다.
"지식을 공유하여 주시는 모든 분들께 진심으로 감사드리며 존경합니다."
- Team. LAMECH 일동
1. #!/bin/bash
기본적으로 shell script에서 '#'는 모두 주석처리 됩니다. 다만 '#!'는 예외지요.
'#!'은 script 제일 앞에서 이 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에 알려주는 역할을 한다고 합니다. '#!' 바로 뒤에 나오는 것은 경로명으로 script에 들어있는 명령어들을 해석할 프로그램의 위치를 나타내는데 그 프로그램이 shell인지, 프로그래밍 언어인지, 유틸리티인지를 나타냅니다. 따라서 '/bin/bash'는 시스템에게 BASH shell 사용하겠다는 것과 동시에 그 위치를 알려줍니다. 보통 LINUX에서의 기본 shell은 BASH입니다. 본인이 사용하는 기본 shell을 확인하시려면 환경변수 'SHELL'을 들여야 보면 됩니다.
2. 변수=내용
'#!/bin/bash' 다음으로 주석문('#'로 시작하는 2, 3번 line)이 나옵니다. 과감히 생략하겠습니다. LOG_DIR, ROOT_UID, LINES, E_XCD, E_NOTROOT는 모두 변수 입니다. 변수에 이어 '='와 변수가 등장합니다. 내용는 /var/log처럼 directory가 될 수도 있고, 0이나 50처럼 숫자가 될 수도 있습니다. 중요한 것은 변수를 지정함에 있어서 '=' 좌/우로 공백문자가 허용되지 않는다는 것 입니다. '=' 전후로 띄어쓰기를 하면 안됩니다.
3. 조건문
아시겠지만, shell script에도 조건문이 존재합니다. if문 이죠. 기본 형식은 아래 3가지가 있습니다.
① if [ condition ]
then
executable code @ satisfy condition
fi
② if [ condition ]
then
executable code @ satisfy condition
else
executable code @ do not satisfy condition
fi
③ if [ first condition ]
then
executable code @ satisfy first condition
elif [second condition]
executable code @ satisfy second condition
else
executable code @ do not satisfy all conditions
fi
첫 번째 조건문의 조건은 [ "$UID" -ne "$ROOT_UID" ] 입니다. '$변수'은 변수의 내용을 나타냅니다.즉, '$UID'는 super-user인 경우 0을 '$ROOT_UID'는 0을 말합니다.
'-ne'는 not equal 정도로 보시면 될 것 같습니다. 따라서 UID의 값과 ROOT_UID의 값이 같지 않다면 참이 되어 then 이후의 executable code를 실행하게 됩니다. 여기서 주의할 점은 condition과 대괄호([ ])사이의 공백문자 입니다. 띄어쓰기가 없다면 해석기는 예제의 첫 번째 조건문인 super-user 판단을 건너 뛰게 됩니다. 말이 나온 김에 [ condition ]의 형태로 표현되는 조건식에 대해 알아 보죠.
① 문자열 비교
[ string ] - string이 빈 문자열이 아니라면 참
[ string1 = string2 ] - 두 문자열이 같다면 참
[ string1 != string2 ] - 두 문자열이 다르면 참
[ -n string ] - 문자열이 null(빈 문자열) 이 아니라면 참
[ -z string ] - 문자열이 null(빈 문자열) 이라면 참
② 산술 비교
[ expr1 -eq expr2 ] - 두 표현식 값이 같다면 참 ('EQual')
[ expr1 -ne expr2 ] - 두 표현식 값이 같지 않다면 참 ('Not Equal')
[ expr1 -gt expr2 ] - expr1 > expr2 이면 참 ('Greater Than')
[ expr1 -ge expr2 ] - expr1 >= expr2 이면 참 ('Greater Equal')
[ expr1 -lt expr2 ] - expr1 < expr2 이면 참 ('Less Than')
[ expr1 -le expr2 ] - expr1 <= expr2 이면 참 ('Less Equal')
[ ! expr ] - expr 이 참이면 거짓, 거짓이면 참
[ expr1 -a expr2 ] - expr1 AND expr2 의 결과 (둘다 참이면 참, 'And')
[ expr1 -o expr2 ] - expr1 OR expr2 의 결과 (둘중 하나만 참이면 참, 'Or')
③ 파일 조건
[ -b FILE ] - FILE 이 블럭 디바이스 이면 참
[ -c FILE ] - FILE 이 문자 디바이스 이면 참.
[ -d FILE ] - FILE 이 디렉토리이면 참
[ -e FILE ] - FILE 이 존재하면 참
[ -f FILE ] - FILE 이 존재하고 정규파일이면 참
[ -g FILE ] - FILE 이 set-group-id 파일이면 참
[ -h FILE ] - FILE 이 심볼릭 링크이면 참
[ -L FILE ] - FILE 이 심볼릭 링크이면 참
[ -k FILE ] - FILE 이 Sticky bit 가 셋팅되어 있으면 참
[ -p FILE ] - True if file is a named pipe.
[ -r FILE ] - 현재 사용자가 읽을 수 있는 파일이면 참
[ -s FILE ] - 파일이 비어있지 않으면 참
[ -S FILE ] - 소켓 디바이스이면 참
[ -t FD ] - FD 가 열려진 터미널이면 참
[ -u FILE ] - FILE 이 set-user-id 파일이면 참
[ -w FILE ] - 현재 사용자가 쓸 수 있는 파일(writable file) 이면 참
[ -x FILE ] - 현재사용자가 실행할 수 있는 파일(Executable file) 이면 참
[ -O FILE ] - FILE 의 소유자가 현재 사용자이면 참
[ -G FILE ] - FILE 의 그룹이 현재 사용자의 그룹과 같으면 참
[ FILE1 -nt FILE2 ] - : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참
[ FILE1 -ot FILE2 ] - : FILE1이 FILE2 보다 오래된 파일이면 참 [ FILE1 -ef FILE2 ] - : FILE1 이 FILE2의 하드링크 파일이면 참
조건식이 만족될 경우 echo와 exit가 실행 됩니다. exit는 다음에 알아보기로 하고 여기서는E_NOTROOT 값을 반환하고 script를 종료합니다. 두 번째 조건문 [ -n $1 ]에 대해서 알아보겠습니다. $1은 현재 shell script의 사용 가능한 첫 번째 위치 매개변수를 나타냅니다. 아래 예제를 한 번 보시죠.
이해가 가십니까? 무작정 예제는 첫 번째 위치 매개변수가 없습니다. '$1'은 null문자로 대체 되겠죠. '-n'은 이어 나오는 문자열이 null이 아니라면 참 입니다. 따라서 'then' 이후의 executable code는 건너뛰고 'else' 이후의 code가 실행 됩니다. 즉, 변수 'lines'에 'LINES'의 값인 50 대입 됩니다.