쉘 스크립트 if 다중 조건 - swel seukeulibteu if dajung jogeon

If 문

Makefile로 빌드할때나, Shell Script (sh파일 등)을 만들 때 if문은 자주 사용된다.

예 :

  • 디렉토리가 없으면 만들기
  • 파일이 존재하는지 확인하기 등

if문의 기본 사용법과 어떤 연산자들이 있는지 알아보도록 하겠다.

기본 사용법

if [ 조건식 ]; then //if문 시작
...
elif
...
else
...
fi //if문 종료
  • 주의할 점
    • if문 선언시의 띄어쓰기(" ")와 세미 콜론(;)
      • if와 대괄호 사이는 반드시 한 칸씩 띄워주어야 함
        • 예: if [ 0 == 0 ]

테스트 연산자

대괄호 안의 조건식에는 여러 종류의 테스트 연산자를 사용할 수 있다.

연산자의 종류 및 기능은 다음과 같다

-e : 존재하는 파일이면 true

-f : 보통 파일이면 true

-d : 파일이 디렉토리면 true

-s : 파일크기가 0이 아니면 true

-z: 문자열이 null / 길이가 0이면 true

-n : 문자열이 null이 아니면 true

-h : 파일이 하드 링크

-L : 파일이 심볼릭 링크

-r: 테스트를 돌리는 사용자가 읽기 퍼미션을 갖고 있음

-w : 테스트를 돌리는 사용자가 쓰기 퍼미션을 갖고 있음

-x : 테스트를 돌리는 사용자가 실행 퍼미션을 갖고 있음

-g : 파일이나 디렉토리에 set-group-id 플래그가 세팅되어 있음.

예:

if [ -d /richet ]; then
    echo '/richet 디렉토리가 존재한다.'

else
    echo '/richet 디렉토리가 존재하지 않는다.'

fi

파일과 관련한 연산자일 경우는 연산자 뒤에 파일명이, 디렉토리와 관련한 연산일 경우에는 연산자 뒤에 디렉토리명이 명시되어야 한다.

산술 비교 연산자 및 문자열 비교 연산자

-eq : equal

  • ==로 대치가능

-ne : not equal

  • ≠ 로 대치 가능

-gt : greater than

-ge : grater than or equal

-lt : less than

-le : less than or equal

예 : 30번 돌았을 때 멈추고 싶을 때

COUNT=1
age=0
while [ 1 == 1 ]; do
    if [ $COUNT -eq 30 ]; then
        let age=COUNT
        echo 'age reached to '$age
        break
    fi
    let COUNT=COUNT+1
done;

echo 'I am '$age'years old.'

논리 연산자

대괄호([ ]) 안에 조건식에 두 개 이상의 조건을 넣어야 할 경우 사용

-a : &&

-o : ||

if [ 조건식1 -a 조건식2 ]; then
~
else
~
fi

Input값 받아서 처리하기

  • 외부로 부터 받은 input 값을 스크립트 내부에서 처리해야 하는 경우가 종종 발생한다.
  • 예: ./test_input.sh [input_parameter1] [input_parameter2]
    • 위와 같이 외부로부터 받은 input 값은 위치 매개변수를 통하여 처리한다
$1, $2, $3 .. 

test_input.sh파일이 위와 같이 생겼을 때.

  • input_parameter1은 $1 위치 매개변수로,
  • input_parameter2는 $2위치 매개변수로
  • 침고 : $0 은 해당 shell script의 이름을 의미함. 여기선 test_input.sh가 되겠다.

예:

#!/bin/sh
if [ $1 -eq 30 ] then
    echo 'input 값은 30'
else
    echo 'input 값은 30이 아님'
fi

위와 같은 check_value.sh파일을 만들고

./check_value.sh 100
./check_value.sh 30

둘 다 해보고 결과값을 확인해보자.

커맨드의 출력값 받아서 처리하기

haha.sh = haha를 출력하는 .sh파일임.

  • grep -q를 활용해서 처리
    • grep = 커맨드 결과에서 특정 string이 있는지 없는지 확인하고, 있으면 그 string을 포함한 line을 출력
      • 예를 들어 echo haha | grep 'ha' 하면 haha가 다 출력됨
if ./haha.sh | grep -q 'cc'; then
    echo it contains haha
fi
  • 여기서 -q = 결과물을 출력하지 않겠다는 옵션
  • 따라서 위 커맨드는 아무것도 출력하지 않음

IT창고

이전 글에서 쉘 스크립트의 기초적인 부분과 if문의 조건식에 대해 알아보았습니다.

이번에는 이중if문과 case문에 대해 알아보도록 하겠습니다.

이중if문을 사용한 간단한 스크립트를 만들어보도록 하겠습니다.

쉘 스크립트 if 다중 조건 - swel seukeulibteu if dajung jogeon

위의 사진과 같은 결과는 아래의 소스코드에서 확인 가능한 쉘 스크립트로 만들어졌습니다.

#!/bin/bash

Gsk=/etc/passwd

if [ -f $Gsk ]; then
    echo "현재 계정 정보=" `id`
      if [ -O $Gsk ]; then
        echo "해당 파일은 현재 계정의 소유파일 입니다"
      else
        echo "해당 파일은 현재 계정의 소유파일이 아닙니다."
      fi
  else
    echo "현재 디렉토리는 존재하지 않습니다"
fi


exit 0

쉘 스크립트 기초와 if문 조건식에서 알아보았던 내용을 조합해서 만들었으며 사용자 변수에 파일의 경로를 넣어두었으며 첫 if문에서 현재 계정의 ID값과 해당 파일이 있는지 확인 후 참일 경우 두번째 if문에서 해당 파일이 현재 계정의 소유파일 인지 확인하는 쉘 스크립트 입니다. 
소스코드가 얼마안될때는 괜찮지만 if문이 중접될수록 복잡해질 수 있습니다. 그럴 경우 elif문을 이용할 수 있으며 아래에 elif문을 사용한 쉘 스크립트를 확인해보도록 하겠습니다.

쉘 스크립트 if 다중 조건 - swel seukeulibteu if dajung jogeon

위의 사진과 같은 결과는 아래의 소스코드에서 확인 가능한 쉘 스크립트로 만들어졌습니다.

#!bin/bash

Gsk=/etc/passwd

if [ -O $Gsk ]; then
    echo "현재 계정 정보=" `id`
    echo "해당 파일은 현재 계정의 소유파일 입니다"
      elif [ -G $Gsk ]; then
        echo "현재 계정 정보=" `id`
        echo "해당 파일은 현재 계정의 소유권은 없으며 그룹권한을 가진 파일 입니다"
      else
        echo "현재 계정 정보=" `id`
        echo "해당 파일은 현재 계정의 소유 및 그룹파일이 아닙니다." 
fi


exit 0

처음 만들었던 쉘 스크립트를 elif문을 사용하여 변형 시켜보았습니다. 

elif문을 쓰면 else문은 elif문으로 대처되며 elif문을 연속해서 사용하여 복합적으로 사용이 가능합니다.

마지막으로 case에 대해 알아보도록 하겠습니다.

elif문은 연속해서 복합적으로 사용이 가능한데 만약 한가지의 변수만을 계속해서 확인할 경우 case문으로 대처가 가능합니다. 

쉘 스크립트 if 다중 조건 - swel seukeulibteu if dajung jogeon

위의 사진과 같은 결과는 아래의 소스코드에서 확인 가능한 쉘 스크립트로 만들어졌습니다.

#!/bin/bash

echo "1. /etc/paswd 2. /etc/ 3. /var/log"
echo -e "/etc/passwd 파일 선택하기 = "
read word

case $word in
    "1") echo "passwd 파일 맞음" ;;
    "2") echo "passwd 파일 아님" ;;
    "3") echo "passwd 파일 아님" ;;

esac

echo ""
echo ""
echo -e "/etc/passwd,  파일 직접 입력하기"
read word2

case $word2 in
    "/etc/bash") echo "passwd 파일 아님" ;;
    "/etc/profile") echo "passwd 파일 아님" ;;
    "/etc/passwd") echo "passwd 파일 맞음" ;;
    *) echo "잘못된 선택" ;;

esac

위에 case문 예제를 2개 확인해 볼 수 있습니다. 1번째 예제는 1,2,3 번 숫자를 선택해서 1번 선택 시 정상적인 선택이라는 메세지를 출력합니다. read 명령어를 받아 변수값에 직접적으로 값을 넣어주는것도 가능하며 2번째 예제에서는 직접 파일경로를 입력하여 출력되며 3가지 값 중에 맞지는 값을 입력할 경우 잘못된 선택 메세지로 출력이 됩니다.

case문 사용 예제로 확인해보았으며 쉘 스크립트의 경우 대부분은 if문으로 작성이 가능합니다.