top of page

[BSS] BASH shell script 무작정 예제

  • Seyoung Cheon
  • 2016년 9월 11일
  • 4분 분량

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 대입 됩니다.

최근 게시물

전체 보기
[LSP] 나에게 운영체제란?

안녕하세요. Team. LAMECH 입니다. 오랜만의 게시물이네요. 근 일년동안 흥미를 잃고 헤메다가 이제 다시 마음을 다잡고 시작합니다. 이번의 주제는 운영체제 입니다. 너무 뻔한 주제인데 개념 정리의 차원에서 게시해 봅니다. 저에게...

 
 
 
[LSP] System Call 이란? (1)

안녕하세요. Team. LAMECH 입니다. 벌써 10월 입니다. 그 더웠던 여름은 온데간데 없고 이제는 아침, 저녁으로 쌀쌀하네요. 제 아들, 딸이 요즘 감기에 걸려 애들 엄마가 엄청 고생하고 있습니다. 전 24개월된 무려 이란성 쌍둥이 아빠...

 
 
 
추천 게시물
최근 게시물
SERVICES CATEGORY
보관
태그 검색
공식 SNS 페이지
  • Facebook Basic Square
  • Google+ Basic Square
  • YouTube Social  Icon

Copyright (C) 2016. All right reserved by Team. LAMECH

bottom of page