Bash/Shell 스크립트를 작성하다 보면 사용자로부터 키보드 입력을 받아야 하는 경우가 자주 생깁니다. 이 글에서는 read 명령어 하나만으로 스크립트에 사용자 입력 기능을 손쉽게 추가하는 방법을 예제와 함께 소개합니다.
read 명령어란?
셸 스크립트에서 사용자 입력을 읽어 들일 때는 이름 그대로 read 명령어를 사용합니다. 기본 문법은 다음과 같습니다.
read OPTIONS VARIABLES
read 명령어의 동작 방식을 정리하면 다음과 같습니다.
- 표준 입력(standard input)으로부터 한 줄을 읽어 지정한 변수에 저장합니다.
- 일반적으로 표준 입력은 키보드가 연결된 터미널이지만, 파이프(pipe)나 리다이렉션을 통해 다른 입력을 전달할 수도 있습니다.
- 사용자 입장에서는 화면이 멈추고 입력을 기다리며, 값을 입력한 뒤 ENTER 키를 누르면 스크립트가 다음 단계로 진행됩니다.
- OPTIONS: 아래 표의 옵션 플래그를 조합해 read 명령어의 동작을 변경할 수 있습니다.
- VARIABLES: 입력값을 저장할 변수 목록으로, 공백으로 구분해 여러 개를 지정할 수 있습니다.
- -p 옵션과 함께 사용하면 각 변수마다 입력 안내 메시지를 표시할 수 있습니다.
- 공백이나 특수 문자가 포함된 값을 입력하려면 따옴표로 묶어야 합니다.
| read 명령어 주요 옵션 | 설명 |
|---|---|
| -a array | 읽어 들인 단어들을 0번 인덱스부터 시작해 배열 변수 ARRAY에 순서대로 저장합니다. |
| -p prompt | 입력을 받기 전에 줄바꿈 없이 PROMPT 문자열을 출력합니다. |
| -r | 백슬래시(\)가 문자를 이스케이프하지 않도록 합니다. |
| -s | 터미널에서 입력되는 내용을 화면에 표시하지 않습니다(비밀번호 입력 등에 유용). |
| -t timeout | TIMEOUT 초 이내에 한 줄의 입력이 완료되지 않으면 실패를 반환하고 종료합니다. |
그 밖의 전체 옵션 목록은 언제나처럼 매뉴얼 페이지에서 확인할 수 있습니다.
man read
read 명령어로 사용자 입력 받기
아래 예제들을 통해 Bash/Shell 스크립트에서 read 명령어를 활용하는 다양한 방법을 살펴보겠습니다.
참고: 각 예제 첫 줄의 #!/bin/bash는 셰뱅(shebang)이라고 부르며, 이 스크립트를 bash로 실행하라는 의미를 시스템에 알려주는 역할을 합니다.
단순히 입력값 받기
가장 기본적인 사용법은 입력값 하나를 그대로 변수에 저장하는 것입니다.
#!/bin/bash read word echo You just typed $word
위 예제에서는 입력값이 $word 변수에 저장된 후 echo 명령어로 화면에 출력됩니다. 별도의 안내 메시지 없이 화면이 멈추고 사용자가 무언가를 입력한 뒤 ENTER 키를 누를 때까지 대기하며, 입력이 완료되면 스크립트가 이어서 실행됩니다.
여러 개의 값을 입력받으려면 변수를 공백으로 구분해 나열하면 됩니다.
#!/bin/bash read word1 word2 echo You just typed $word1 followed by $word2
안내 메시지와 함께 입력 요청하기
화면이 조용히 멈춰 있는 것만으로는 사용자 친화적이지 않습니다. 보통은 사용자에게 어떤 값을 입력해야 하는지 알려주는 것이 좋습니다. 예를 들어 사용자 이름이나 비밀번호를 입력받을 때가 그렇습니다.
#!/bin/bash read -p 'Username: ' username read -sp 'Password: ' password echo Your username is $username, we will not display your password
위 예제에서 -p 옵션은 프롬프트, 즉 사용자에게 각 변수에 어떤 값을 입력해야 하는지 알려주는 메시지를 출력하는 역할을 합니다.
또한 비밀번호 변수에는 -s 옵션을 함께 사용했습니다. 이 옵션은 입력되는 내용을 화면에 표시하지 않도록 해서 비밀번호 입력 시 매우 유용합니다.
여러 개의 값을 한 번에 입력받기
안내 메시지를 표시하면서 여러 값을 동시에 입력받을 수도 있습니다.
#!/bin/bash read -p 'Please type your first and last name: ' first last echo Your name is $first $last
예/아니오 질문하기
while 루프와 case 문을 조합하면 사용자에게 간단한 예/아니오 질문을 던질 수 있습니다. y 또는 Y로 시작하는 입력은 "예", n 또는 N으로 시작하는 입력은 "아니오"로 처리됩니다.
#!/bin/bash
while true; do
read -p "Do you wish to perform this action?" yesno
case $yesno in
[Yy]* )
echo "You answered yes"
;;
[Nn]* )
echo "You answered no, exiting"
exit
;;
* ) echo "Answer either yes or no!";;
esac
done
이 스크립트는 "아니오"가 입력될 때까지 반복 실행되며, 코드를 약간만 수정하면 특정 작업 수행 여부를 확인하는 등 다양한 상황에 맞게 쉽게 확장할 수 있습니다.