개요
우분투 터미널에서 단순한 문법 기호로 여겨지던 대괄호 ‘[‘가 실제 독립된 명령어라는 사실을 아시나요? 본 글에서는 ‘[’ 명령어의 정체와 동작 원리를 파헤치고, 출력 결과인 종료 상태 코드($?)를 올바르게 읽고 활용하는 방법을 알아봅니다.
1. ‘[’ 명령어의 정체 확인과 실행 파일 위치 찾기
which [ 명령어를 실행하여 대괄호([)가 시스템 내에 실제 실행 파일 경로로 존재하는지 확인합니다.
실행 결과 /usr/bin/[ 경로가 반환되며, [가 단순한 쉘 문법 기호가 아니라 독립적인 실행 파일임을 알 수 있습니다.
⚙️ [주요 옵션]
-f : 파일이 일반 파일(regular file)인지 확인합니다.-d : 대상이 디렉터리인지 검사합니다.-e : 파일이나 디렉터리가 실제로 존재하는지 여부를 판별합니다.-z : 문자열의 길이가 0(빈 문자열)인지 확인합니다.-n : 문자열의 길이가 0이 아닌지(비어 있지 않은지) 검사합니다.= : 두 문자열이 서로 일치하는지 비교합니다.-eq : 두 정수 값이 같은지 비교합니다.-ne : 두 정수 값이 서로 다른지 비교합니다.
type -a [ 명령어를 실행하여 현재 쉘 환경에서 [ 명령어가 어떻게 해석되고 탐색되는지 상세히 확인합니다.
실행 결과를 보면 쉘 내장 명령어(shell builtin)로 먼저 등록되어 있으며, 동시에 /usr/bin/[ 및 /bin/[ 경로의 외부 실행 파일로도 함께 존재함을 확인할 수 있습니다.
ls -l /usr/bin/[ 명령어를 실행하여 실제 바이너리 파일의 권한과 크기 등 상세 정보를 조회합니다.
실행 권한(-rwxr-xr-x)을 가진 일반 실행 파일로 디스크에 저장되어 있음을 직접 확인할 수 있습니다.
2. ‘[’ 명령어 기본 사용법과 종료 상태 코드($?) 확인
[ 10 -gt 5 ] 명령어를 실행하여 10이 5보다 큰지(-gt, greater than) 비교 연산을 수행합니다.
대괄호([) 명령어는 연산 성공 시 화면에 아무것도 출력하지 않고 종료 상태 코드만 반환합니다.
![[ 10 -gt 5 ]](/ubuntu/20261010_020600_29/captures/s02_c01_10_-gt_5.png)
echo $? 명령어를 실행하여 직전에 수행된 [ 명령어의 종료 상태 코드 값을 확인합니다.
출력 결과 0이 반환되며, 리눅스 쉘 환경에서 조건 평가가 ‘참(True)‘으로 정상 종료되었음을 나타냅니다.

[ 10 -lt 5 ] 명령어를 실행하여 10이 5보다 작은지(-lt, less than) 비교 연산을 수행합니다.
이전과 마찬가지로 표준 출력을 남기지 않으며, 조건의 참/거짓 여부는 내부 종료 상태 코드로 기록됩니다.
![[ 10 -lt 5 ]](/ubuntu/20261010_020600_29/captures/s02_c03_10_-lt_5.png)
echo $? 명령어를 실행하여 방금 평가된 조건식의 종료 상태 코드를 조회합니다.
반환된 종료 상태 코드를 통해 조건 연산 결과의 성공 및 실패 상태를 명확히 판별할 수 있습니다.

3. 파일 및 디렉터리 검사 실습 (-f, -d, -s)
[ 명령어의 파일 검사 실습을 위한 테스트 디렉터리와 빈 샘플 파일을 준비하기 위해 mkdir -p /tmp/bracket_test && touch /tmp/bracket_test/sample.txt 명령어를 실행합니다.

[ -f /tmp/bracket_test/sample.txt ] && echo "파일이 정상적으로 존재합니다" 명령어를 실행하여 지정한 경로가 실제 존재하는 일반 파일인지 검사합니다.
조건식이 참으로 평가되어 && 연산자 뒤의 안내 문구가 정상적으로 출력됩니다.
![[ -f /tmp/bracket_test/sample.txt ] && echo “파일이 정상적으로 존재합니다”](/ubuntu/20261010_020600_29/captures/s03_c02_-f__tmp_bracket_test_sample_txt______echo__%ED%8C%8C%EC%9D%BC%EC%9D%B4_%EC%A0%95.png)
[ -d /tmp/bracket_test ] && echo "디렉터리가 맞습니다" 명령어를 실행하여 검사 대상이 디렉터리 경로인지 확인합니다.
대상 경로가 디렉터리로 확인되어 성공 종료 코드를 반환하고 메시지를 출력합니다.
![[ -d /tmp/bracket_test ] && echo “디렉터리가 맞습니다”](/ubuntu/20261010_020600_29/captures/s03_c03_-d__tmp_bracket_test______echo__%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EA%B0%80_%EB%A7%9E%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
[ -s /tmp/bracket_test/sample.txt ] || echo "파일 크기가 0(비어있음)입니다" 명령어를 실행하여 파일의 크기가 0보다 큰지 검사합니다.
방금 생성한 빈 파일은 크기가 0이므로 조건식이 거짓이 되어 || 연산자 뒤의 메시지가 실행됩니다.
![[ -s /tmp/bracket_test/sample.txt ] || echo “파일 크기가 0(비어있음)입니다”](/ubuntu/20261010_020600_29/captures/s03_c04_-s__tmp_bracket_test_sample_txt______echo__%ED%8C%8C%EC%9D%BC_%ED%81%AC%EA%B8%B0.png)
4. 실무 Bash 조건문(if) 및 단축 평가 연계 활용법
파일 내용 유무에 따른 조건문 분기 실습을 위해 echo "Ubuntu Shell Test" > /tmp/bracket_test/sample.txt 명령어를 실행하여 텍스트 데이터를 파일에 기록합니다.

if [ -s /tmp/bracket_test/sample.txt ]; then echo "내용 확인: $(cat /tmp/bracket_test/sample.txt)"; fi 명령어를 실행하여 실제 쉘 스크립트에서 쓰이는 if 조건문과 [ 명령어를 연계합니다.
파일의 크기가 0이 아니라는 조건(-s)이 참으로 판별되어 then 블록 내부의 안내 문구와 파일 내용이 정상적으로 출력됩니다.
![if [ -s /tmp/bracket_test/sample.txt ]; then echo “내용 확인: $(cat /tmp/bracket_test/sample.txt)”; fi](/ubuntu/20261010_020600_29/captures/s04_c02_if___-s__tmp_bracket_test_sample_txt____then_echo.png)
실습에 사용했던 테스트 디렉터리와 샘플 파일을 정리하기 위해 rm -rf /tmp/bracket_test 명령어를 실행합니다.

지금까지 리눅스 대괄호([) 명령어의 실체와 동작 원리, 그리고 종료 코드를 확인하는 법을 간단하게 살펴보았습니다.
쉘 스크립트 작성 시 문법 오류를 줄이고 직관적인 코드를 작성하는 데 도움이 되기를 바랍니다.