본문 바로가기
클라우드 아키텍트 양성과정

쉘 프로그래밍 조건문과 반복문

by 종바깅 2021. 5. 12.

조건문

조건에 따라 수행할 동작을 지정

  • if : 조건이 맞으면 실행, 아니면 패스

  • if~else : 조건이 맞으면 if 아래를 실행, 조건이 틀리면 else 아래를 실행, 양자택일

  • ifelse ifelse : 조건이 여러개. 첫 번째 조건이 맞으면 if 아래를 실행, 두번째 조건이 맞으면 두번째 else if 아래를 실행. 모든 조건이 틀리면 else 아래를 실행. 다지선다

  • 조건문의 문법 : if, then, if

      if (조건)
      then
      (if 실행할 내용)
      fi
    
      if (조건)
      then
      (if 실행할 내용)
      else
      (else 실행할 내용)
      fi
    
      if (조건1)
      then
      (if 조건1에 따라 실행할 내용)
      elif (조건2)
      then
      (elif 조건2에 따라 실행할 내용)
      elif (조건 3...)
      then
      (elif 조건3...에 따라 실행할 내용)
      ...
      else
      (모든 조건을 만족하지 않을 경우 실행할 내용)
      fi
  • case = ifelse ifelse 와 유사한 동작, 다지선다

      case 변수명 in
      값1) 실행할 내용1 ;;
      값2) 실행할 내용2 ;;
      값3) 실행할 내용3 ;;
      *) 실행할 내용 4
      esac
  • 쉘프로그래밍의 조건문에서의 '조건'

    • 명령의 실행 결과가 if 조건으로 사용됨 : 종료상태(Exit Status)
      • 정상종료 0((True)
      • 비정상 종료 : 0이 아닌 모든 값(false)
    • 일반적인 수치 비교, 문자, 문자열 비교 : test
      • 수치비교
        • == : INT1 -eq INT2 (eqaul)
        • != : INT1 -ne INT2 (not equal)
        • > : INT1 -gt INT2 (greater than)
        • < : INT1 -lt INT2 (less than)
        • >= : INT1 -ge INT2 (greater or equal)
        • <= : INT1 -le 1INT2 (less or equal)
      • 문자 비교
        • 문자열1 = 문자열2 : 문자열1과2가 같으면 참
        • 문자열1 != 문자열2 : 문자열 1과 2가 같지 않으면 참
        • 문자열 : 문자열이 NULL 이 아니먄 참, NULL 이면 거짓
        • -z 문자열 : 문자열의 길이가 0이면 참, 아니면 거짓
        • -n 문자열 : 문자열의 길이가 0이 아니면 참 0이면 거짓
      • test 명령어는 []로 대체가능
      • ksh, bash 이후에 나온 쉘은 다음과 같은 기능도 사용가능
        • [[]]를 사용하여 단순비교 이외의 비교도 가능
        • [[문자열=패턴]] : 문자열에 패턴이 포함되어 있는가(정규화 표현식이 아닌 패턴의 일부 기능 사용 가능)
          • [문자집합] : 문자집합 중 한 글자
          • ? : 한글자
          • *: 모든 글자
        • [[문자열!=패턴]] : 문자열에 패턴이 포함되지 않았는가
        • [[문자열1>문자열2]] : 문자열 1과 2의 ASCII 대소 비교
        • let을 사용하여 간단한 수치비교 가능 (( ))
        • ((변수1>숫자)) : 변수의 값이 숫자보다 큰가
        • ((변수1=변수2+변수3)) : 변수를 사용한 계산 가능
      • 파일관련 조건 확인 [ <옵션> <파일명> ]
        • -b : 블록 장치인지 확인
        • -c : 캐릭터 장치인지 확인
        • -d : 디렉토리인지 확인
        • -e : 종류에 상관없이 파일이 있는지 확인
        • -f : 일반 파일인지 확인
        • -r : test를 수행하는 사용자가 파일의 읽기 권한을 가지고 있는가
        • -w : test를 수행하는 사용자가 파일의 쓰기 권한을 가지고 있는가
        • -x : test를 수행하는 사용자가 파일의 실행 권한을 가지고 있는가
        • -u : SetUID 가 설정되어 있는가
        • -g : SetGID 가 설정되어 있는가
        • -k : StickyBit 가 설정되어 있는가
  • /usr/bin/true, /usr/bin/false : 다른 역할은 하지 않으면서 종료상태만 변경

  • ':' true와 같은 역할

  • test 사용시 조건의 논리합/논리곱

    • [ 조건1 -a 조건2 ] : 조건1과 조건2를 모두 만족하여야 참
    • [[ 조건1 && 조건2 ]] : 위와 동일
    • [ 조건1 -o 조건2 ] : 조건1과 조건2중 하나만 만족하면 참
    • [[ 조건1 || 조건2 ]] : 위와 동일

조건문, case 테스트

[root@server1 ~]# vi fruit.sh

#! /bin/bash

echo "Input Fruits name : "
read FRUIT

if [ $FRUIT = 'apple' ]
then
        echo "APPLE"
elif [ $FRUIT = 'banana' ]
then
        echo "banana"
else
        echo "cherry"
fi

case $FRUIT in
apple)  echo APPLE ;;
banana) echo BANANA ;;
*)      echo CHERRY ;;
esac

[root@server1 ~]# chmod +x fruit.sh
[root@server1 ~]# ./fruit.sh

연습문제

  1. 파일명을 입력받고, 입력받은 파일의 종류(일반파일, 디렉토리, 블록장치, 캐릭터장치…)가 무엇인지 출력하는 스크립트를 작성해보세요.

     [hint]
     input filename : /etc/passwd
     /etc/passwd : normal file
    
     input filename : /dev/sda
     /dev/sda : block device file
    
     input filename : /tmp
     /tmp : directory
    
     [answer]
     #!/bin/bash
    
     echo -n "Input filename : "
     read FILENAME
    
     if [ -f $FILENAME ]
     then
             echo "$FILENAME : normal file"
     elif [ -d $FILENAME ]
     then
             echo "$FILENAME : directory"
     elif [ -b $FILENAME ]
     then
             echo "$FILENAME : block device file"
     elif [ -c $FILENAME ]
     then
             echo "$FILENAME : character device file"
     else
             echo "I don't know"
     fi
  2. 숫자 두개와 연산자를 입력받아 계산 결과를 출력하는 프로그램을 작성해보세요.

     [hint]
     input number: 10
     input number: 20
     operator : +
     10 + 20 = 30
    
     [answer]
     #!/bin/bash
    
     echo -n "Input number1 : "
     read NUM1
     echo -n "Input number2 : "
     read NUM2
    
     echo -n "Input operator : "
     read OPER
    
     case $OPER in
     '+') echo "$NUM1 + $NUM2 = `expr $NUM1 + $NUM2`" ;;
     '-') echo "$NUM1 - $NUM2 = `expr $NUM1 - $NUM2`" ;;
     '/') echo "$NUM1 / $NUM2 = "`echo "scale=2;$NUM1/$NUM2" | bc` ;;
     '*') echo "$NUM1 X $NUM2 = `expr $NUM1 \* $NUM2`" ;;
     *) echo "ERROR!" ;;
     esac
  3. df -h 명령을 사용해서 확인할 수 있는 ‘/’ 에 마운트된 장치의 사용량이 50%를 초과할 경우 메세지를 출력하는 프로그램을 작성하시오.

     [hint]
     /dev/mapper/centos-root   47G  5.7G   42G  13% /
     ‘/’ USE% is under 50%
    
     /dev/mapper/centos-root   47G  5.7G   42G  53% /
     ‘/’ USE% is over 50%
    
     [answer]
     #!/bin/bash
    
     DFRESULT="/dev/mapper/centos-root   47G  5.7G   42G  63% /"
     echo "SAMPLE: $DFRESULT"
    
     USEPERCENT=`echo $DFRESULT | awk '{ print $5 }'`
     echo "Current USE% : "$USEPERCENT
    
     USEPERCENT=`echo ${USEPERCENT:0:-1}`
    
     if (( USEPERCENT>50 ))
     then
             echo "OVER 50%!"
     else
             echo "UNDER 50%!"
     fi

반복문(Loop)

지정한 횟수, 또는 조건에 따라 반복을 수행

for(i=0;i<10;i++){
    printf(“Hello!\n”)
}

C언어 등 일반적인 프로그래밍 언어 반복문의 조건 형태

  • 초기식 : 특정 변수를 초기값으로 설정
  • 비교식 : 반복여부를 결정하기 위하여 조건을 확인
  • 증감식 : 조건에 사용되는 변수의 값을 변경

쉘 프로그래밍의 반복문 : for

for 변수 in [argument]
do
[실행할 내용]
done
  • argument : 반복문에서 변수에 집어 넣을 값의 리스트

    • 공백,개행 등으로 구분되어 있는 텍스트
    • 명령의 실행결과 : '명령어' (back tic `)
    • 파일의 내용 : 'cat [파일이름]' (back tic `)
    • 변수의 값 : $변수명
    • 위치매개변수 : $, $@, “$”, “$@”
  • 위치 매개변수를 반복문의 argument로 사용할 경우

    • $*, $@ : 각 위치매개변수의 값을 그대로 나열하므로, 사이에 공백이 들어있는 하나의 매개변수를 분리함
    • "$*" : 전체 위치메개변수의 값을 하나의 문자열로 처리
    • "$@" : 위치매개변수 중 공백을 포함하고 있는 항목만 따로 ' '로 묶어서 처리
  • argument에 숫자 사용방법

    • 단순 숫자 나열 : 직접 반복문에 사용할 변수에 집어넣을 숫자를 나열
    • seq 명령 사용
      • seq [숫자] : 1부터 지정한 숫자까지 1씩 증가하며 출력
      • seq [숫자1] [숫자2] : 숫자1 부터 숫자2까지 1씩 증가하며 출력
      • seq [숫자1] [숫자2] [숫자3] : 숫자 1부터 숫자 3까지 숫자2 만큼씩 증가시키며 출력

쉘 프로그래밍의 반복문 : while, until

  • while의 동작

    • while내부 명령을 실행하기 전 조건을 확인

    • 조건을 만족할 경우 실행

    • 조건을 만족하지 않을경우 done 아래로 이동

    • 조건을 true 등 언제나 참인 조건으로 사용할 경우는 무한루프로 동작

    • 사용자가 입력하는 값을 변수에 집어넣어서 비교하여 종료하는 방식

      while [조건]
      do
        [실행할 내용]
      done
  • until : while의 반대, 조건이 거짓일 경우에 반복 수행

      until [조건]
      do
          [실행할 내용]
      done

중첩 반복문과 break, continue

중첩반복문

  • 반복문 내부에 반복문이 포함되는 형태

  • 내부 반복문은 외부 반복문이 한번 실행될 때 마다 전체 반복문을 수행

    • 구구단 : 단/곱할 수

        #! /bin/bash
      
        for i in `seq 2 9`
        do
                for j in `seq 9`
                do
                        echo "$i X $j = " `expr $i \* $j`
                done
        done
break
  • 반복문을 탈출하는 용도(if내에서 탈출하는 용도로는 사용할 수 없음)
  • 탈출 위치는 현재 break가 사용된 반복문의 done 아래로 이동
  • 중첩 반복문에서 사용될 경우, 한 단계의 반복문만 탈출
  • break [n] : 지정한 갯수만큼의 반복문을 한꺼번에 탈출
  • exit : 반복문이 아니라 스크립트 전체를 종료
    • exit [n] : 스크립트를 종료하면서 종료상태값을 설정
continue
  • 반복문의 흐름을 변경시키는 용도
  • continue를 만날 경우, 현재 있는 반복문의 조건 위치로 이동(do 앞으로)
  • continue [n] : 한꺼번에 지정된 갯수만큼 반복문 위로 올라감

댓글