본문 바로가기
리눅스공부/셸 스크립트 프로그래밍

[프로그래밍] IF문과 CASE문 / 셸 스크립트 프로그래밍 조건문

by 으노으뇨 2022. 12. 21.
728x90
반응형
SMALL

기본 if문

대부부분의 프로그래밍 언어에서 지원하는 if문
기본 if 문법은 아래와 같다.
if [ 조건 ]
then
참일 경우 실행
fi

주의할 점은 [ 조건 ] 사이의 각 단어에는 모두 공백이 있어야한다.!

스크립트 생성
if문을 작성했다.
스크립트를 실행하니 결과 로 true가 나온 모습

소스 설명

  • 2행 : [ ]  사이에는 참과 거짓을 구분하는 조건식이 들어간다. ' = ' 은 문자열이 같은지 비교하며, ' != ' 은 문자열이 같지 않은지 비교한다. if1.sh 에서는 조건식이 참이므로 4행을 실행한다. 또, ' [ ] ' 대신 test라는 키워드를 사용할 수 도 있다. 2행과 if test "woo" = "woo" 는 동일한 구문이다.

if ~ else 문

참인 경우와 거짓인 경우를 구분해서 실행한다.
if [ 조건 ]
then
 참인경우 실행하는 소스
else 
 거짓인 경우 실행하는 소스
 fi

else문을 작성했다.
실행을 했을때 else 구문이 나온 모습


조건문에 들어가는 비교 연산자

조건문에 들어가는 비교 연산자에는 문자열 비교 연산자와 산술 연산자가 있다.
문자열 비교 결과
"문자열1" = "문자열2" 두 문자열이 같으면 참
"문자열1" != "문자열2" 두 문자열이 같지 않으면 참
-n "문자열" 문자열이 NULL 아니면 참
-z "문자열" 문자열이 NULL 이면 참
산술 비교 결과
수식1 -eq 수식2 두 수식이 같으면 참
수식1 -ne 수식2 수식이 같지 않으면 참
수식1 -gt 수식2 수식1이 크면 참
수식1 -ge 수식2 수식1이 크거나 같으면 참
수식1 -lt 수식2
수식이 작으면 참
수식1 -le 수식2 수식이 작거나 같으면 참
!수식 수식이 거짓이면 참

테스트를 위한 파일 생성
-eq를 사용하기 위해 작성한 모습
-eq의 같이 거짓이 나왔다.


파일과 관련된 조건

if문에서 파일을 처리하는 조건은 아래와 같다.
파일 조건 결과
-d 파일이름 파일이 디렉터리면 참
-e 파일이름 파일이 존재하면 참
-f 파일이름 파일이 일반 파일이면 참
-g 파일이름 파일에 set-group-id 가 설정되면 참
-r 파일이름 파일이 읽기 가능이면 참
-s 파일이름 파일 크기가 0아니면 참
-u 파일이름 파일파일에 set-user-id가 설정되면 참
-w 파일이름 파일이 쓰기 가능 상태면 참
-x 파일이름 파일이 실행 가능 상태면 참

테스트를 위한 스크립트 작성
실행 결과

소스설명

  • 2행 : fname 변수에 cron 서버 실행 파일인 /lib/systemd/system/cron.service 를 저장한다.
  • 3행 : fname 변수에 저장된 /lib/systemd/system/cron.service 파일이 일반 파일이면 참이므로 5행을 실행하고, 그렇지 않으면 거짓이므로 7행을 실행시킨다.
  • 5행 :fname에 들어 있는 파일의 앞에 5줄을 출력한다.

case ~ esac 문

if문은 참거짓과 두 가지 경우만 사용할 수 있다. (이것을 2중 분기라고도 한다) 그런데, 여러가지 경우의 수가 있다면 if문을 계속 중복해서 사용해야 하므로 구문이 복잡해 진다. 
이때 사용하는 것이 case 문이다. 이를 '다중 분기' 라고도 한다.

[1] 첫 번째 예시

swit - case문과 비슷하다.

소스설명

  • 2행 : 첫 번째 파라미터 변수 $1 값에 따라 3행, 5행, 7행, 9행으로 분기한다.
  • 4행 : 3행에서 start) 일경우 실행된다. 주의할 점은 맨 뒤에 새미클론(;;) 을 2개 붙여야 한다.
  • 9행 : 그 외의 것들이 입력되면 실행하는 default 같은 것이다.
  • 11행 : case 문 종료를 표시한다.

[2] 두 번째 예시

조금은 다르다.
작성하고 실행한 모습

소스설명

  • 3행 : answer 변수에 입력한 값을 받는다.
  • 5행 : 입력한 값이 yes, y, Y, Yes, YES 중 하나면 6~7행을 실행한다.
  • 6행 : 실행할 구문이 더 있으므로 끝에 ;;을 붙이지 않는다는 점에 주의한다.
  • 7행 : 실행할 구문이 없으므로 뒤에 ;;을 붙인다.
  • 8행 : [nN]*)는 앞에 n또는 N이 들어가는 단어를 모두 인정해준다는 의미다.
  • 12행 : 정상적인 종료가 아니므로 exit 1로 종료한다. (꼭 해야하는 사항은 아님)

AND, OR 관계 연산자

조건문에서는 and와 or 의미를 가지는 관계 연산자를 사용할 수 있다.
and는 -a 또는 && 를 사용하며, or 는 -o  또는 ||를 사용한다. -a나 -o는 테스트문 ( [ ] ) 안에서 사용할 수 있는데, 이때 괄호 등의 특수 문자 앞에는 역슬래스 ( \ ) 를 붙여야 한다.

스크립트
실파일과 가짜 파일(존재 x)를 실행했을때

소스설명

  • 4행 : 입력한 파일 이름이 일반 파일( -f)이고, 크기가 0이 아니라면 ( -s) 5행을 실행한다. then 구문은 다음 줄에 작성해도 되며, 세미콜론( ; ) 이후에 작성해도 된다. 세미클론은 앞뒤 구문을 행으로 분리해주는 기능이다. 또 이 구문은
    if [ \(-f $fname \) -a \(-s $fname \) ] ; then 과 동일하다.

 

728x90
반응형
LIST

댓글