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.
- 이 튜토리얼은 Linux 시스템에 SSH 액세스가 있다고 가정합니다.
Bash 파일 테스트 연산자는 무엇인가요?
테스트 연산자를 사용하여 파일의 여러 측면을 테스트할 수 있습니다. 파일이 존재하는지, 읽기/쓰기 가능한지 등을 확인할 수 있습니다.
Bash 스크립트에서 테스트 연산자를 사용하면 오류를 방지하는 데 도움이 될 수 있습니다. 아래 코드는 if 문의 기본 형식입니다. if-else 문은 Bash 스크립트에서 자주 볼 수 있는 강력한 도구입니다.
코드 블록의 then과 else 부분은 선택 사항임을 기억하세요. 이들을 사용하지 않고 if 문을 사용할 수도 있습니다.
파일이 존재하는지 확인하기
테스트 연산자가 어떻게 작동하는지 간략히 확인해 보았지만, 그것만으로는 사용 방법을 더 잘 이해하기에는 충분하지 않습니다. 그러므로 파일이 존재하는지 확인하는 것과 같은 기본적인 예제부터 시작해 보겠습니다.
현실 세계에서는 구성 파일을 만들기 전에 해당 파일이 이미 존재하는지 확인하려고 할 수도 있습니다. 이미 동일한 파일이 존재하는지 알아보기 위해 처음부터 구성 파일을 만드는 데 시간을 낭비하고 싶지 않을 것입니다.
파일이 이미 존재하는지 확인하려면 다음 단계를 따릅니다:
1. 터미널을 열고 아래의 touch 명령을 실행하여 새로운 test.txt 파일을 생성합니다. 이 명령은 출력을 제공하지 않지만, 다음 단계에서 파일을 확인할 수 있습니다.
2. 다음으로, 아래의 ls 명령을 실행하여 작업 디렉토리에 새로 생성된 파일 (test.txt)을 나열합니다.
아래의 출력 결과는 test.txt 파일이 성공적으로 생성되었음을 확인합니다.
이제 테스트 파일이 있으므로 다음 단계에서 파일이 존재하는지 확인하기 위해 Bash 스크립트에서 보일러플레이트 코드 블록을 사용할 수 있습니다.

3. 아래 명령을 실행하여 (touch) 새로운 셸 스크립트 파일 (if_file_exists.sh)을 선호하는 텍스트 편집기 (nano)에서 엽니다.
4. 이제 아래 코드를 새로운 if_file_exists.sh 파일에 입력하고, 파일을 저장하고 편집기를 닫습니다.
- 지정된 파일이 존재하는지 테스트하기 위해 if-else 문을 실행합니다.
- 연산자가 true를 반환하면 파일이 존재한다는 메시지가 나타납니다.
- 연산자가 true를 반환하면 파일이 존재하지 않는다는 메시지가 나타납니다. 하지만 이번에는 파일이 자동으로 생성되며, 파일 이름은 FILE 변수에서 정의한 대로 됩니다.
파일의 맨 위에 있는 #!/bin/bash 줄은 shebang라고 합니다. shebang은 스크립트를 실행할 때 시스템에게 어떤 인터프리터를 사용해야 하는지 알려줍니다. 이 예에서는 Bash를 사용합니다. shebang을 포함하지 않으면 시스템은 기본 인터프리터를 사용하며, 이는 Bash가 아닐 수도 있습니다. shebang이 없으면 스크립트 실행에 실패할 수 있습니다.
5. 새로운 스크립트를 실행하려면 아래 명령을 실행하십시오 (if_file_exists.sh)
모두 잘 되면 아래와 같이 터미널에 test.txt가 존재한다는 메시지가 출력됩니다.

6. 다음 명령을 실행하여 테스트 파일 (test.txt)을 삭제 (rm -rf)하고 작업 디렉토리의 모든 파일을 나열하십시오.
아래에서는 test.txt가 더 이상 나열되지 않음을 확인할 수 있습니다.

7. 아래 명령을 다시 실행하여 if_file_exists.sh 스크립트를 실행하십시오.
이제 test.txt 파일이 더 이상 존재하지 않으므로 -e 연산자가 false를 반환할 때 스크립트는 새로운 test.txt 파일을 생성합니다.

8. 마지막으로 아래 ls 명령을 실행하여 작업 디렉토리에서 test.txt 파일을 나열하십시오.
아래 출력은 스크립트가 새로운 test.txt 파일을 생성했음을 확인합니다.

파일이 일반 파일인지 특수 파일인지 확인하는 방법
파일을 열거나 처리하기 전에 해당 파일이 일반 파일인지 특수 파일인지 먼저 확인하고 싶을 수 있습니다. 왜냐하면 특수 파일은 파일 시스템에 저장된 파일 유형이므로 이러한 파일을 잘못 다루지 않도록 주의해야하기 때문입니다.
예를 들어 특수 파일을 열 때 흔히 발생하는 오류는 “해당 파일 또는 디렉토리가 없음” 오류입니다. 이 오류는 열려고 하는 파일이 존재하지 않을 때 발생합니다. 그러나 일반 파일 대신 특수 파일을 열 때도 동일한 오류가 발생할 수 있습니다.
텍스트 편집기에서 새로운 special_file.sh 파일을 열고 다음 코드를 추가하고 변경 사항을 저장하십시오.
다음 코드는 이전 코드와 유사합니다. 하지만 이 코드는 -e
연산자 대신 -f
연산자를 사용합니다. -f
연산자는 지정된 파일(/dev/vmmon
)이 일반 파일인지를 테스트합니다.
FILE
변수에 지정된 파일(/dev/vmmon)이 특수 파일이므로 아래 메시지가 표시됩니다.

디렉터리의 존재 여부 확인하기
지금까지 파일의 존재 여부를 확인하는 방법을 배웠습니다. 그렇다면 동일한 방법이 디렉터리에도 적용되는지 궁금할 것입니다. 네, -d
테스트 연산자를 사용하여 가능합니다. 이 연산자는 디렉터리의 존재 여부에 따라 작업을 수행하는 데 유용합니다.
예를 들어 한 디렉터리의 모든 파일을 다른 디렉터리로 복사하고 싶을 수 있습니다. 대상 디렉터리가 존재하지 않으면 파일을 복사하기 전에 디렉터리를 생성할 수 있습니다.
1. 작업 디렉토리에서 아래 ls 명령을 실행하여 example-dir을 나열합니다.
해당 디렉토리가 존재하지 않기 때문에 “No such file or directory”라는 메시지가 표시됩니다. 디렉토리가 존재하지 않아도 흐름이 중단되지 않도록 하려면 다음 단계로 이동하십시오.

2. 이제 텍스트 편집기에서 if_dir_exists.sh라는 새 파일을 열고 아래 코드를 추가하고 파일을 저장하세요. 다음 코드는 지정된 디렉토리의 존재 여부를 테스트하고 -d 연산자의 반환 값을 기반으로 작업을 수행합니다.
if와 else 문의 순서를 반전시켜도 (!) 부정 연산자를 사용하여 동일한 결과를 얻을 수 있습니다. 실제 상황에서 ! 연산자는 더 깔끔하고 간결한 스크립트 작성에 도움이 될 수 있습니다.
3. 이제 아래 명령을 실행하여 스크립트(if_dir_exists.sh)를 실행합니다.
디렉토리가 생성되었으며, example_dir 가 존재하지 않기 때문에 test.txt 파일이 복사되었습니다.

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

파일이 비어 있는지 확인하기
스크립팅 기술을 향상시키기 위해 가장 많이 사용되는 세 가지 파일 테스트 연산자(-e
, -f
, -d
)를 사용하는 방법을 이미 알고 계십니다. 하지만 여전히 살펴볼만한 다른 연산자들이 있습니다.
일반적으로 파일의 내용을 강조하여 다른 파일로 복사하는 대신, 작업을 수행할 명령을 실행할 것입니다. 그러나 대상 파일이 비어 있을 수도 있으므로 조심하세요.
파일이 존재하고 크기가 0보다 큰지 확인하기 위해 -s
연산자를 사용해보는 것이 어떨까요? 이 연산자는 파일이 존재하고 크기가 0보다 큰 경우 true를 반환합니다.
1. 텍스트 편집기에서 empty_file.sh라는 새 파일을 열고 다음 코드를 추가하고 파일을 저장합니다.
다음 코드는 지정된 파일이 비어 있는지 테스트하고 -s 연산자가 반환하는 값에 따라 메시지를 출력합니다.
2. 이제 아래 명령을 실행하여 스크립트(empty_file.sh)를 실행하세요.
아래에서 test.txt가 존재하지 않거나 비어 있다는 메시지를 볼 수 있습니다. 그러나 동시에 스크립트는 test.txt 파일에 텍스트를 추가합니다.

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

4. 마지막으로 아래 bash 명령을 다시 실행하여 empty_file.sh 스크립트를 실행하세요.
아래에서 출력이 변경되어 test.txt가 존재하고 비어 있지 않다는 메시지를 볼 수 있습니다. 왜냐하면 test.txt 파일에 텍스트가 포함되어 있으며 크기가 0보다 크기 때문입니다.

파일이 존재하고 읽을 수 있는지 확인하기
자동화 작업에는 파일을 읽어서 작업을 수행해야 할 수도 있습니다. 이러한 작업의 성공은 파일이 읽을 수 있는지 여부에 따라 달라집니다. 파일이 존재하고 읽을 수 있는지 확인하는 스크립트를 작성하는 것이 유용한 해결책이 될 것입니다.
파일이 존재하고 읽을 수 있는지 확인하는 데모를 보여주기 위해 다음 명령을 실행하세요:
1. 다른 사용자 계정 (ata)으로 로그인하려면 다음 명령을 실행하세요.
프롬프트가 ($)로 변경되어 다른 사용자로 로그인된 것을 나타냅니다.

또는 chmod 명령을 사용하여 파일의 허가를 읽기 가능한, 쓰기 가능한 또는 둘 다로 변경할 수도 있습니다.
2. 로그인 후 텍스트 편집기를 사용하여 readable_file.sh라는 새 파일을 만드세요.
다음 코드를 readable_file.sh 파일에 추가하고 변경 사항을 저장하세요. 이 코드는 /root 디렉터리에 있는 test.txt라는 파일이 존재하고 읽을 수 있는지 확인합니다.
3. 이제 아래 명령을 실행하여 readable_file.sh 스크립트를 실행하세요.
이번에는 /root/test.txt 파일이 존재하지 않거나 읽을 수 없다는 메시지가 표시됩니다. text.test 파일은 /root 디렉토리에 위치해 있으므로 현재 사용자(ata)는 text.txt 파일을 읽을 수 있는 권한이 없습니다.

4. 아래 명령을 실행하여 다음 작업을 수행하세요:
- sudoers 파일을 변경하여 현재 사용자(ata)가 슈퍼 유저 권한으로 명령을 실행할 수 있도록 합니다.
- readable_file.sh 스크립트를 실행하여 특정 파일이 읽을 수 있는지 테스트합니다.
아래에서 볼 수 있듯이 출력에는 test.txt가 존재하고 읽을 수 있다는 내용이 표시됩니다. 이는 ata 사용자가 이제 test.txt 파일을 읽을 수 있는 권한을 갖고 있기 때문입니다.

결론
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 파일 테스트 연산자를 사용할 수 있는 다른 많은 방법이 있습니다.
어째서 파일의 확장자를 확인해보지 않을까요? 또는 필요한 모든 파일이 사용 가능한지 확인하기 위해 여러 파일이 존재하는지 확인해보는 것은 어떨까요?