리눅스 셸 스크립트 read 명령어 완벽 가이드 - 사용자 입력부터 파일 한 줄씩 읽기까지 실무 팁

개요

리눅스 Bash 셸 스크립트 작성 시 대화형 사용자 입력 처리와 텍스트 데이터 파싱에 필수적인 read 명령어의 핵심 활용법을 다룹니다. 기본 입력 처리부터 비밀번호 마스킹(-s), 타임아웃(-t), 구분자 분할(IFS), 그리고 실무에서 가장 자주 쓰이는 while 루프 기반 파일 라인 단위 처리까지 완벽하게 마스터할 수 있습니다.

1. read 명령어 기본기와 프롬프트(-p) 및 기본값 설정

read 명령어 실습을 위한 전용 공간을 만들고 이동하기 위해 mkdir -p ~/read-demo && cd ~/read-demo 명령어를 실행합니다.

mkdir -p ~/read-demo && cd ~/read-demo

read 명령어는 표준 입력으로부터 한 줄을 읽어 변수에 저장하며, -p 옵션으로 사용자 안내 문구를 출력하고 ${변수명:-기본값} 문법을 활용해 값이 비어 있을 때 기본값을 대체 할당할 수 있습니다.
실행 결과에서는 read 명령어에 직접 입력이 전달되지 않아 username 변수가 빈 상태로 남아 ${username:-guest} 문법에 따라 기본값인 guest가 출력되었습니다.
⚙️ [주요 옵션]

-p : 입력을 받기 전에 화면에 출력할 안내 프롬프트 문자열을 지정합니다.
-s : 비밀번호 등 민감한 정보를 입력받을 때 화면에 입력 문자를 표시하지 않는 비밀 모드를 활성화합니다.
-t : 입력 대기 제한 시간(초)을 설정하여 지정된 시간이 지나면 입력을 종료합니다.
-n : 지정한 문자 개수만큼만 입력을 받고 엔터 키를 누르지 않아도 즉시 종료합니다.
-r : 역슬래시(\) 문자를 이스케이프 문자로 해석하지 않고 원본 그대로 읽어 들입니다.
-a : 입력된 단어들을 공백 기준으로 분리하여 배열 변수에 순서대로 저장합니다.
-d : 줄바꿈 문자 대신 입력을 종료할 구분자(delimiter) 문자를 직접 지정합니다.

bash -c ‘read -p “사용자 이름을 입력하세요: " username; echo “입력된 사용자: ${username:-guest}” «< “tester”’

2. 비밀번호 마스킹(-s) 및 입력 제한 시간(-t) 처리

실습을 계속 진행하기 위해 앞서 생성한 ~/read-demo 디렉터리로 cd ~/read-demo 명령어를 실행하여 이동합니다.

cd ~/read-demo

-s 옵션으로 입력 화면을 마스킹하고 -t 5 옵션으로 5초의 제한 시간을 부여한 상태에서 입력을 받습니다.
비밀번호가 제한 시간 내에 정상적으로 전달되어 종료 상태 코드($?)가 0으로 출력되었습니다.

bash -c ‘read -t 5 -sp “비밀번호를 입력하세요 (5초 제한): " userpass; echo; echo “입력 완료 여부: $?” «< “secret1234”’

3. 구분자(IFS)와 -a 옵션을 활용한 다중 변수 및 배열 분할

실습을 계속 진행하기 위해 앞서 생성한 ~/read-demo 디렉터리로 cd ~/read-demo 명령어를 실행하여 이동합니다.

cd ~/read-demo

내부 필드 구분자(IFS)를 쉼표(,)로 지정한 뒤 Here-String(<<<)으로 전달된 CSV 형태의 문자열을 read 명령어로 읽어 들여 col1, col2, col3 변수에 각각 분할 저장합니다.
실행 결과 문자열에 포함된 서버명, IP 주소, 서비스명이 지정한 구분자에 맞춰 각 변수에 정상적으로 나뉘어 출력되었습니다.

bash -c ‘IFS=”,” read -r col1 col2 col3 «< “server01,192.168.1.10,nginx”; echo “서버: $col1 | IP: $col2 | 서비스: $col3”’

구분자(IFS)를 콜론(:)으로 설정하고 -a 옵션을 함께 사용하여 /etc/passwd 형식의 문자열을 user_info 배열 변수에 분할 저장합니다.
배열의 0번째 인덱스인 계정명(root)과 6번째 인덱스인 로그인 셸 경로(/bin/bash)가 정상적으로 추출되어 출력되었습니다.

bash -c ‘IFS=":" read -ra user_info «< “root:x:0:0:root:/root:/bin/bash”; echo “계정명: ${user_info[0]}, 셸: ${user_info[6]}”’

4. 실무 핵심: while 루프와 read -r을 이용한 대용량 파일 라인 단위 처리

실습을 계속 진행하기 위해 앞서 생성한 ~/read-demo 디렉터리로 cd ~/read-demo 명령어를 실행하여 이동합니다.

cd ~/read-demo

파일 라인 단위 처리 실습을 위해 서버 이름과 가동 상태가 쉼표로 구분된 샘플 CSV 파일인 servers.csv를 생성합니다.

echo -e “server-web,running\nserver-db,stopped\nserver-cache,running” > servers.csv

while 루프와 read -r 명령어를 함께 사용하고 내부 필드 구분자(IFS)를 쉼표(,)로 지정하여 servers.csv 파일의 각 행을 한 줄씩 안전하게 읽어 들입니다.
실행 결과 파일에 기록된 각 서버의 이름과 상태 정보가 name과 status 변수에 정상적으로 분할 대입되어 포맷에 맞게 출력되었습니다.

while IFS="," read -r name status; do echo “[상태 점검] $name 서버는 현재 $status 상태입니다.”; done < servers.csv

지금까지 리눅스 셸 스크립트에서 활용할 수 있는 read 명령어의 기본 사용법부터 실무에서 자주 쓰이는 파일 한 줄씩 읽기 기법까지 간단하게 살펴보았습니다.
오늘 정리한 다양한 옵션과 예제를 바탕으로 상황에 맞는 대화형 자동화 스크립트를 직접 작성해보시길 바랍니다.