예제를 통한 Bash 파일 테스트 연산자 학습

Bash는 놀라울 만큼 유연하며 파일 테스트를 위한 다양한 옵션을 제공합니다. 파일을 테스트하는 방법을 찾고 있다면, Bash 파일 테스트 연산자로 원하는 곳으로 이동할 수 있습니다.

이 튜토리얼에서는 다른 파일 테스트 연산자와 해당 연산자를 사용하여 파일이 존재하는지, 읽을 수 있는지, 비어 있는지 등을 테스트하는 방법을 배우게 됩니다.

계속해서 Bash 파일 테스트 연산자를 알아보고 친구가 되어보세요!

사전 준비 사항

이 튜토리얼은 실습으로 진행됩니다. 함께 따라하려면 다음 사항이 필요합니다:

  • A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.

대부분의 리눅스 배포판에는 기본적으로 Bash가 설치되어 있습니다. 그러나 Windows를 사용하고 있다면 Windows Subsystem for Linux (WSL)을 설치하여 Bash 쉘을 사용할 수 있습니다.

  • A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.

Bash 파일 테스트 연산자는 무엇인가요?

테스트 연산자를 사용하여 파일의 여러 측면을 테스트할 수 있습니다. 파일이 존재하는지, 읽기/쓰기 가능한지 등을 확인할 수 있습니다.

Bash 스크립트에서 테스트 연산자를 사용하면 오류를 방지하는 데 도움이 될 수 있습니다. 아래 코드는 if 문의 기본 형식입니다. if-else 문은 Bash 스크립트에서 자주 볼 수 있는 강력한 도구입니다.

코드 블록의 then과 else 부분은 선택 사항임을 기억하세요. 이들을 사용하지 않고 if 문을 사용할 수도 있습니다.

# 테스트하려는 파일을 나타냅니다.
# 대상 파일의 이름으로 file_name을 대체하세요.
FILE="file_name"
# 연산자 - 사용할 파일 테스트 연산자입니다.
if [ Operator $FILE ]

then
 # 연산자가 참을 반환할 경우 수행할 작업입니다.
 do something

else
 # 연산자가 거짓을 반환할 경우 수행할 작업입니다.
 do something

fi

파일이 존재하는지 확인하기

테스트 연산자가 어떻게 작동하는지 간략히 확인해 보았지만, 그것만으로는 사용 방법을 더 잘 이해하기에는 충분하지 않습니다. 그러므로 파일이 존재하는지 확인하는 것과 같은 기본적인 예제부터 시작해 보겠습니다.

현실 세계에서는 구성 파일을 만들기 전에 해당 파일이 이미 존재하는지 확인하려고 할 수도 있습니다. 이미 동일한 파일이 존재하는지 알아보기 위해 처음부터 구성 파일을 만드는 데 시간을 낭비하고 싶지 않을 것입니다.

파일이 이미 존재하는지 확인하려면 다음 단계를 따릅니다:

1. 터미널을 열고 아래의 touch 명령을 실행하여 새로운 test.txt 파일을 생성합니다. 이 명령은 출력을 제공하지 않지만, 다음 단계에서 파일을 확인할 수 있습니다.

touch test.txt

2. 다음으로, 아래의 ls 명령을 실행하여 작업 디렉토리에 새로 생성된 파일 (test.txt)을 나열합니다.

ls -al test.txt

아래의 출력 결과는 test.txt 파일이 성공적으로 생성되었음을 확인합니다.

이제 테스트 파일이 있으므로 다음 단계에서 파일이 존재하는지 확인하기 위해 Bash 스크립트에서 보일러플레이트 코드 블록을 사용할 수 있습니다.

Listing the newly-created file

3. 아래 명령을 실행하여 (touch) 새로운 셸 스크립트 파일 (if_file_exists.sh)을 선호하는 텍스트 편집기 (nano)에서 엽니다.

touch if_file_exists.sh && nano if_file_exists.sh

4. 이제 아래 코드를 새로운 if_file_exists.sh 파일에 입력하고, 파일을 저장하고 편집기를 닫습니다.

  • 지정된 파일이 존재하는지 테스트하기 위해 if-else 문을 실행합니다.
  • 연산자가 true를 반환하면 파일이 존재한다는 메시지가 나타납니다.
  • 연산자가 true를 반환하면 파일이 존재하지 않는다는 메시지가 나타납니다. 하지만 이번에는 파일이 자동으로 생성되며, 파일 이름은 FILE 변수에서 정의한 대로 됩니다.

파일의 맨 위에 있는 #!/bin/bash 줄은 shebang라고 합니다. shebang은 스크립트를 실행할 때 시스템에게 어떤 인터프리터를 사용해야 하는지 알려줍니다. 이 예에서는 Bash를 사용합니다. shebang을 포함하지 않으면 시스템은 기본 인터프리터를 사용하며, 이는 Bash가 아닐 수도 있습니다. shebang이 없으면 스크립트 실행에 실패할 수 있습니다.

#!/bin/bash
# FILE - 테스트하려는 파일의 값을 저장하는 변수입니다.
# $FILE 변수의 값을 변경하여 동일한 코드 블록을 여러 파일에 대해 테스트할 수 있습니다.
  # -e 연산자는 파일의 존재 여부를 테스트합니다.
FILE="test.txt"

# 연산자가 true를 반환하면 파일이 존재한다는 메시지를 출력합니다.
if [ -e $FILE ]
then
  # 연산자가 true를 반환하면 파일이 존재하지 않는다는 메시지를 출력하고,
  echo "$FILE exists"
else
  # 그런 다음 FILE 변수에서 정의한 이름으로 파일을 생성합니다.
    # 관련 자료:
  echo "$FILE does not exist, creating new file" && touch test.txt
fi

5. 새로운 스크립트를 실행하려면 아래 명령을 실행하십시오 (if_file_exists.sh)

bash if_file_exists.sh

모두 잘 되면 아래와 같이 터미널에 test.txt가 존재한다는 메시지가 출력됩니다.

test.txt exists

6. 다음 명령을 실행하여 테스트 파일 (test.txt)을 삭제 (rm -rf)하고 작업 디렉토리의 모든 파일을 나열하십시오.

rm -rf test.txt
ls test.txt

아래에서는 test.txt가 더 이상 나열되지 않음을 확인할 수 있습니다.

Deleting the test file

7. 아래 명령을 다시 실행하여 if_file_exists.sh 스크립트를 실행하십시오.

이제 test.txt 파일이 더 이상 존재하지 않으므로 -e 연산자가 false를 반환할 때 스크립트는 새로운 test.txt 파일을 생성합니다.

bash if_file_exists.sh
Rerun your if_file_exists.sh script

8. 마지막으로 아래 ls 명령을 실행하여 작업 디렉토리에서 test.txt 파일을 나열하십시오.

ls -al test.txt

아래 출력은 스크립트가 새로운 test.txt 파일을 생성했음을 확인합니다.

Listing the new test.txt file

파일이 일반 파일인지 특수 파일인지 확인하는 방법

파일을 열거나 처리하기 전에 해당 파일이 일반 파일인지 특수 파일인지 먼저 확인하고 싶을 수 있습니다. 왜냐하면 특수 파일은 파일 시스템에 저장된 파일 유형이므로 이러한 파일을 잘못 다루지 않도록 주의해야하기 때문입니다.

예를 들어 특수 파일을 열 때 흔히 발생하는 오류는 “해당 파일 또는 디렉토리가 없음” 오류입니다. 이 오류는 열려고 하는 파일이 존재하지 않을 때 발생합니다. 그러나 일반 파일 대신 특수 파일을 열 때도 동일한 오류가 발생할 수 있습니다.

텍스트 편집기에서 새로운 special_file.sh 파일을 열고 다음 코드를 추가하고 변경 사항을 저장하십시오.

다음 코드는 이전 코드와 유사합니다. 하지만 이 코드는 -e 연산자 대신 -f 연산자를 사용합니다. -f 연산자는 지정된 파일(/dev/vmmon)이 일반 파일인지를 테스트합니다.

#!/bin/bash
# /dev/vmmon 파일은 특수 파일입니다
  # Linux에서 하드웨어 장치와 통신하는 데 사용됩니다.
FILE="/dev/vmmon"

# 파일을 테스트합니다 
if [ -f $FILE ]
then
  # 연산자가 true를 반환하면 일반 파일임을 나타내는 메시지가 표시됩니다.
    # 연산자가 true를 반환하면 파일이 존재하지 않거나 일반 파일임을 나타내는 메시지가 표시됩니다.
  echo "$FILE is a regular file"

else
  # 아래 명령을 실행하여 
    # special_file.sh 스크립트를 실행합니다.
  echo "Either $FILE does not exist or is not a regular file"

fi

bash special_file.sh

FILE 변수에 지정된 파일(/dev/vmmon)이 특수 파일이므로 아래 메시지가 표시됩니다.

Checking if a file is a regular file

디렉터리의 존재 여부 확인하기

지금까지 파일의 존재 여부를 확인하는 방법을 배웠습니다. 그렇다면 동일한 방법이 디렉터리에도 적용되는지 궁금할 것입니다. 네, -d 테스트 연산자를 사용하여 가능합니다. 이 연산자는 디렉터리의 존재 여부에 따라 작업을 수행하는 데 유용합니다.

예를 들어 한 디렉터리의 모든 파일을 다른 디렉터리로 복사하고 싶을 수 있습니다. 대상 디렉터리가 존재하지 않으면 파일을 복사하기 전에 디렉터리를 생성할 수 있습니다.

1. 작업 디렉토리에서 아래 ls 명령을 실행하여 example-dir을 나열합니다.

ls -la example-dir

해당 디렉토리가 존재하지 않기 때문에 “No such file or directory”라는 메시지가 표시됩니다. 디렉토리가 존재하지 않아도 흐름이 중단되지 않도록 하려면 다음 단계로 이동하십시오.

Listing the example-dir from the working directory

2. 이제 텍스트 편집기에서 if_dir_exists.sh라는 새 파일을 열고 아래 코드를 추가하고 파일을 저장하세요. 다음 코드는 지정된 디렉토리의 존재 여부를 테스트하고 -d 연산자의 반환 값을 기반으로 작업을 수행합니다.

if와 else 문의 순서를 반전시켜도 (!) 부정 연산자를 사용하여 동일한 결과를 얻을 수 있습니다. 실제 상황에서 ! 연산자는 더 깔끔하고 간결한 스크립트 작성에 도움이 될 수 있습니다.

#!/bin/bash
# 디렉토리 이름을 dir 변수에 정의합니다.
dir=example_dir

# 디렉토리(dir)의 존재 여부를 테스트합니다.
if [ ! -d $dir ]
then
  # 연산자가 true를 반환하면, dir 변수의 값에 따라 디렉토리를 생성합니다.
  mkdir $dir
  # test.txt 파일을 새로 생성된 디렉토리로 복사합니다.
  cp test.txt $dir
  # 위에서 수행한 작업에 대한 메시지를 출력합니다.
  echo "The directory has been created, and the test.txt file has been copied."
else
  # 연산자가 false를 반환하면, 
    # echo 명령을 사용하여 디렉토리가 존재한다는 메시지를 출력합니다.
  echo "Directory $dir exists"
fi

3. 이제 아래 명령을 실행하여 스크립트(if_dir_exists.sh)를 실행합니다.

bash if_dir_exists.sh

디렉토리가 생성되었으며, example_dir 가 존재하지 않기 때문에 test.txt 파일이 복사되었습니다.

Executing the if_dir_exists.sh to test if a directory exists

4. 마지막으로, example_dir 디렉토리에 대해 ls 명령을 실행하여 디렉토리가 존재하고 test.txt 파일이 포함되어 있는지 확인합니다.

ls -la example_dir
Confirming the example_dir directory exists and contains the test.txt file

파일이 비어 있는지 확인하기

스크립팅 기술을 향상시키기 위해 가장 많이 사용되는 세 가지 파일 테스트 연산자(-e, -f, -d)를 사용하는 방법을 이미 알고 계십니다. 하지만 여전히 살펴볼만한 다른 연산자들이 있습니다.

일반적으로 파일의 내용을 강조하여 다른 파일로 복사하는 대신, 작업을 수행할 명령을 실행할 것입니다. 그러나 대상 파일이 비어 있을 수도 있으므로 조심하세요.

파일이 존재하고 크기가 0보다 큰지 확인하기 위해 -s 연산자를 사용해보는 것이 어떨까요? 이 연산자는 파일이 존재하고 크기가 0보다 큰 경우 true를 반환합니다.

1. 텍스트 편집기에서 empty_file.sh라는 새 파일을 열고 다음 코드를 추가하고 파일을 저장합니다.

다음 코드는 지정된 파일이 비어 있는지 테스트하고 -s 연산자가 반환하는 값에 따라 메시지를 출력합니다.

#!/bin/bash
# 대상 파일의 이름을 정의합니다.
FILE=test.txt

# -s 연산자는 대상 파일이 존재하고 비어 있지 않은지를 테스트합니다.
if [ -s $FILE ]
then
  # 연산자가 true를 반환하면 echo 명령이 메시지를 출력합니다.
    # 파일이 존재하고 비어 있지 않다는 메시지를 출력합니다.
  echo "$FILE exists and is not empty"
else
  # 연산자가 false를 반환하면 echo 명령이 메시지를 출력합니다.
    # 파일이 존재하지 않거나 비어 있음을 알리는 메시지를 출력합니다.
  echo "$FILE either does not exist or is empty"
  # 대상 파일에 텍스트를 추가합니다.
  echo "This is a test. This is not an empty file" > $FILE
fi

2. 이제 아래 명령을 실행하여 스크립트(empty_file.sh)를 실행하세요.

bash empty_file.sh

아래에서 test.txt가 존재하지 않거나 비어 있다는 메시지를 볼 수 있습니다. 그러나 동시에 스크립트는 test.txt 파일에 텍스트를 추가합니다.

Executing the empty_file.sh file to test if the text.txt file is empty

3. 아래 cat 명령을 실행하여 test.txt 파일에 추가된 텍스트가 있는지 확인하세요.

cat test.text
Verifying the text.txt file’s content

4. 마지막으로 아래 bash 명령을 다시 실행하여 empty_file.sh 스크립트를 실행하세요.

bash empty_file.sh

아래에서 출력이 변경되어 test.txt가 존재하고 비어 있지 않다는 메시지를 볼 수 있습니다. 왜냐하면 test.txt 파일에 텍스트가 포함되어 있으며 크기가 0보다 크기 때문입니다.

Rerunning the empty_file.sh script to check if the test.txt file is empty

파일이 존재하고 읽을 수 있는지 확인하기

자동화 작업에는 파일을 읽어서 작업을 수행해야 할 수도 있습니다. 이러한 작업의 성공은 파일이 읽을 수 있는지 여부에 따라 달라집니다. 파일이 존재하고 읽을 수 있는지 확인하는 스크립트를 작성하는 것이 유용한 해결책이 될 것입니다.

파일이 존재하고 읽을 수 있는지 확인하는 데모를 보여주기 위해 다음 명령을 실행하세요:

1. 다른 사용자 계정 (ata)으로 로그인하려면 다음 명령을 실행하세요.

su - ata

프롬프트가 ($)로 변경되어 다른 사용자로 로그인된 것을 나타냅니다.

Logging in to another user account

또는 chmod 명령을 사용하여 파일의 허가를 읽기 가능한, 쓰기 가능한 또는 둘 다로 변경할 수도 있습니다.

2. 로그인 후 텍스트 편집기를 사용하여 readable_file.sh라는 새 파일을 만드세요.

다음 코드를 readable_file.sh 파일에 추가하고 변경 사항을 저장하세요. 이 코드는 /root 디렉터리에 있는 test.txt라는 파일이 존재하고 읽을 수 있는지 확인합니다.

#!/bin/bash
# 대상 파일 정의
FILE=test.txt

# 대상 파일이 읽을 수 있는지 테스트
# -r을 -w로 변경하여 파일이 쓰기 가능한지 테스트할 수도 있습니다.
if [ -r $FILE ] 
then  
  # 참인 경우, 파일이 존재하고 읽을 수 있다는 메시지를 출력합니다.
    # 거짓인 경우, 파일이 존재하지 않거나 읽을 수 없다는 메시지를 출력합니다.
  echo "$FILE exists and is readable" 
else  
  # 스크립트의 실행 결과를 출력합니다.
    # 파일이 존재하지 않거나 읽을 수 없음을 나타내는 메시지를 출력합니다.
  echo "$FILE does not exist or is unreadable"
fi

3. 이제 아래 명령을 실행하여 readable_file.sh 스크립트를 실행하세요.

bash readable_file.sh

이번에는 /root/test.txt 파일이 존재하지 않거나 읽을 수 없다는 메시지가 표시됩니다. text.test 파일은 /root 디렉토리에 위치해 있으므로 현재 사용자(ata)는 text.txt 파일을 읽을 수 있는 권한이 없습니다.

Executing the readable_file.sh script

4. 아래 명령을 실행하여 다음 작업을 수행하세요:

  • sudoers 파일을 변경하여 현재 사용자(ata)가 슈퍼 유저 권한으로 명령을 실행할 수 있도록 합니다.
  • readable_file.sh 스크립트를 실행하여 특정 파일이 읽을 수 있는지 테스트합니다.
sudo bash
bash readable_file.sh

아래에서 볼 수 있듯이 출력에는 test.txt가 존재하고 읽을 수 있다는 내용이 표시됩니다. 이는 ata 사용자가 이제 test.txt 파일을 읽을 수 있는 권한을 갖고 있기 때문입니다.

Changing the sudoers file and executing the readable_file.sh script

결론

A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.

이러한 새로운 기술을 활용하여 테스트 결과에 따라 어떤 작업을 수행할지 자신감 있게 결정할 수 있습니다. 그러나 Bash 파일 테스트 연산자를 사용할 수 있는 다른 많은 방법이 있습니다.

어째서 파일의 확장자를 확인해보지 않을까요? 또는 필요한 모든 파일이 사용 가능한지 확인하기 위해 여러 파일이 존재하는지 확인해보는 것은 어떨까요?

Source:
https://adamtheautomator.com/bash-file-test/