쿼카러버의 기술 블로그

Linux Shell Script - IF 문, 다양한 연산자들(-d, -eq, -a)(디렉토리가 존재하는지 확인하고 싶을 때 등) 본문

Linux - Ubuntu/Shell Script

Linux Shell Script - IF 문, 다양한 연산자들(-d, -eq, -a)(디렉토리가 존재하는지 확인하고 싶을 때 등)

quokkalover 2021. 7. 18. 11:57

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 = 결과물을 출력하지 않겠다는 옵션
  • 따라서 위 커맨드는 아무것도 출력하지 않음
Comments