[shell script] if문에서 파일 비교 조건문

HYEOB KIM·2022년 4월 13일
0

Shell

목록 보기
11/71

쉘 스크립트에서는 파일과 관련한 조건문을 작성할 수 있습니다.

비교 방법

비교 방법설명
-e filePath단순히 경로가 존재(exist)하는지
-d filePath경로가 존재하고, 디렉토리(directory)인지
-f filePath경로가 존재하고, 파일(file)인지
-r filePath경로가 존재하고, 읽을 수(read) 있는지
-s filePath경로가 존재하고, 비어있지 않은지
-w filePath경로가 존재하고, 쓸 수(write) 있는지
-x filePath경로가 존재하고, 실행(execute)할 수 있는지
-O filePath경로가 존재하고, 현재 사용자소유(Owner)한 것인지
-G filePath경로가 존재하고, 기본 그룹(Group)이 현재 사용자의 기본 그룹과 같은지

if문에서 사용하기

디렉토리와 파일의 존재 여부를 활용한 예제

  1. location 변수에 디렉토리까지의 경로를 할당합니다.
  2. location 변수값의 경로가 디렉토리이면 디렉토리 내에 test 파일이 있는지 따져봅니다.
    • test 파일이 있다면, 해당 파일에 >> 출력 리다이렉트를 통해 현재 날짜와 시간(date)를 입력합니다.
    • test 파일이 없다면, echo 문구를 출력하고 끝냅니다.
  3. location 변수값의 경로가 존재하지 않거나 디렉토리가 아니라면, echo 문구를 출력하고 끝냅니다.
$ cat test1
#!/bin/bash
location=$HOME/devops/Script
file_name=test
if [ -d $location ]
then
        echo "There is $location directory"
        echo "Checking on the file, $file_name"
        if [ -f $location/$file_name ]
        then
                echo "Update Current Date..."
                date >> $location/$file_name
        else
                echo "File doesn't exist"
                echo "Nothing to update"
        fi
else
        echo "Directory doesn't exist"
        echo "Nothing to update"
fi

스크립트를 실행하면 디렉토리는 존재하지만 파일이 없기 때문에 File doesn't exist 문구가 나오는 것을 볼 수 있습니다.

$ ./test1
There is /home/hyeob/devops/Script directory
Checking on the file, test
File doesn't exist
Nothing to update

test라는 파일을 생성해주고 다시 스크립트를 실행시켜 보겠습니다.

$ touch test

$ ./test1
There is /home/hyeob/devops/Script directory
Checking on the file, test
Update Current Date...

$ cat test
Wed 13 Apr 2022 08:17:34 AM UTC

test 파일에 내용이 추가되었습니다.
내용을 확인해보면 현재 날짜(date)가 추가된 것을 확인할 수 있습니다.

읽을 수 없는 파일에 대한 예제

/etc/shadow는 사용자들의 암호가 저장되어 있기 때문에 일반 사용자는 읽을 수가 없습니다.

이것을 활용한 예제를 보겠습니다.

$ cat test1
#!/bin/bash
file_name=/etc/shadow
if [ -f $file_name ]
then
        echo "There is a $file_name"
        echo "Checking on the file, $file_name"
        if [ -r $location/$file_name ]
        then
                echo "I can read $file_name"
                cat /etc/shadow
        else
                echo "I can't read $file_name"
        fi
else
        echo "$file_name doesn't exist"
fi

$ ./test1
There is a /etc/shadow
Checking on the file, /etc/shadow
I can't read /etc/shadow

/etc/shadow 파일은 존재하지만 읽을 수가 없기 때문에 echo "I can't read /etc/shadow"가 실행된 것을 볼 수 있습니다.

빈 파일에 대한 예제

test라는 빈 파일을 생성하고 진행해보겠습니다.

$ touch test
  1. 해당 파일 경로에 test 파일이 있는지 확인하고,
  2. 파일이 있다면 파일이 비어있지 않은지 확인합니다.
    • 파일이 비어있지 않다면 그대로 두고,
    • 파일이 비어있다면, 해당 파일을 삭제합니다.
$ cat test1
#!/bin/bash
file_name=$HOME/devops/Script/test
if [ -f $file_name ]
then
        echo "There is a $file_name"
        echo "Checking on the file, $file_name"
        if [ -s $file_name ]
        then
                echo "$file_name is not empty"
        else
                echo "$file_name is empty"
                echo "Deleting empty file..."
                rm $file_name
        fi
else
        echo "$file_name doesn't exist"
fi

$ ./test1
There is a /home/hyeob/devops/Script/test
Checking on the file, /home/hyeob/devops/Script/test
/home/hyeob/devops/Script/test is empty
Deleting empty file...
profile
Devops Engineer

0개의 댓글