변수와 사용자 입력

ShellBeginner
지금 연습하기

소개

로봇 웨이터가 있다고 상상해 봅니다. 정적인 (Static) 로봇은 누구에게나 항상 "Hello, Sir"라고만 말할 수 있습니다. 반면 동적인 (Dynamic) 로봇은 이름을 물어보고 "Hello, Sarah" 또는 "Hello, Mike"라고 말할 수 있습니다.

이전 실습에서는 스크립트가 항상 똑같은 작업만 수행했습니다. 이번 실습에서는 스크립트 외부에서 데이터를 받을 수 있도록 만들어 스크립트를 동적으로 바꿉니다.

이는 프로그래밍에서 큰 변화입니다. 스크립트가 입력을 받을 수 있으면 고정된 예제가 아니라 재사용 가능한 도구가 됩니다.

스크립트와 상호 작용하는 두 가지 방법을 배웁니다.

  1. 묻고 듣기: 스크립트가 일시 중지한 뒤 질문을 하고 사용자의 입력을 받습니다 (read 사용).
  2. 메모 전달하기: 스크립트를 시작하는 순간 인수를 사용해 데이터를 전달합니다.

이 실습을 마치면 "World"뿐 아니라 원하는 누구에게나 인사하는 코드를 작성할 수 있습니다.

대화형 입력에 read 사용하기

첫 번째 방법은 "대화형" 방식입니다. 스크립트가 질문을 출력한 다음 답변을 기다리도록 만듭니다.

read 명령을 사용합니다. read는 다음과 같이 말하는 명령이라고 생각하면 됩니다. "하던 일을 모두 멈추고, 사용자의 입력을 기다려라."

이는 스크립트가 실행되는 동안 데이터를 받는 첫 번째 예제입니다. 셸 스크립팅에서 변수는 사용자 이름, 파일 이름 또는 숫자와 같은 데이터를 임시로 저장하는 이름이 있는 공간입니다. 변수를 사용하면 하드 코딩된 텍스트 대신 변경되는 입력을 처리할 수 있으므로 스크립트를 재사용할 수 있습니다.

먼저 프로젝트 작업 공간에 있는지 확인합니다.

cd ~/project

nano를 사용해 hello.sh라는 새 파일을 만듭니다.

nano hello.sh

다음 코드를 입력합니다.
참고: 사용자의 답변을 저장할 name이라는 "상자"(변수) 를 정의합니다.

#!/bin/bash

echo "What is your name?"
read name
echo "Hello, $name!"

코드를 나누어 살펴보겠습니다.

  • echo "...": 스크립트가 사용자에게 말을 겁니다.
  • read name: 스크립트가 사용자의 입력을 받습니다. 입력한 내용은 name 상자에 저장됩니다.
  • $name: 스크립트가 상자를 엽니다. $ 기호는 변수에 저장된 값을 확인하는 열쇠입니다.

name과 $name의 차이에 주의합니다. name은 변수를 만들거나 값을 저장할 때 사용하는 변수의 이름입니다. $name은 "변수 안에 저장된 값으로 이 부분을 바꿔라"라는 뜻입니다. 이처럼 변수 이름을 실제 값으로 바꾸는 과정을 **확장 (expansion)**이라고 하며, 셸의 가장 중요한 동작 중 하나입니다.

작업 내용을 저장하고 (Ctrl+O, Enter), 편집기를 종료합니다 (Ctrl+X).

대화형 스크립트 실행하기

스크립트와 대화하려면 먼저 스크립트를 실행할 수 있도록 권한을 부여해야 합니다. 이전 실습에서 배운 "키"를 기억하시나요?

실행 권한을 부여합니다.

chmod +x hello.sh

이제 스크립트와 대화해 보겠습니다. 스크립트를 실행합니다.

./hello.sh

스크립트가 "What is your name?"이라고 질문한 뒤 일시 중지합니다. 스크립트가 입력을 기다리는 상태입니다. 커서가 깜박일 수 있습니다.

이름 (예: Alice) 을 입력하고 Enter 키를 누릅니다.

What is your name?
Alice
Hello, Alice!

이를 **대화형 입력 (Interactive Input)**이라고 합니다. 사람이 직접 사용하는 도구에는 유용하지만 자동화에는 적합하지 않습니다. 새벽 3 시에 이 스크립트를 자동으로 실행한다고 생각해 보세요. 아무도 답하지 않으므로 스크립트가 입력을 기다린 채 멈추게 됩니다.

이 차이는 실제 운영 작업에서 중요합니다. 사람이 직접 작업하는 경우에는 대화형 스크립트가 편리하지만, 예약 작업, CI 파이프라인, 시작 스크립트는 일반적으로 사람이 개입하지 않아도 실행되도록 비대화형 입력이 필요합니다.

비대화형 입력에 인수 사용하기

스크립트를 자동화에 적합하게 만들려면 실행이 시작되기 전에 데이터를 전달하는 방법이 필요합니다. 그러면 스크립트가 일시 중지할 필요가 없습니다. 이때 **인수 (Arguments)**를 사용합니다.

인수는 문의 "우편함"과 비슷합니다. 지나가면서 메시지를 우편함에 넣는 것처럼 스크립트에 값을 전달합니다.

Bash 에서는 이러한 우편함에 번호가 붙은 이름을 사용합니다.

  • $1은 스크립트 이름 뒤에 입력하는 첫 번째 단어입니다.
  • $2는 두 번째 단어이며, 그다음은 $3과 같은 순서로 이어집니다.

이러한 번호가 붙은 값을 **위치 매개변수 (positional parameters)**라고 합니다. 스크립트가 시작될 때 셸이 자동으로 만듭니다. $1을 직접 정의하지 않아도 됩니다. Bash 가 스크립트를 실행한 명령줄에서 값을 가져와 $1에 채웁니다.

이제 hello.sh가 질문을 표시하는 대신 첫 번째 우편함인 $1을 확인하도록 수정합니다.

파일을 엽니다.

nano hello.sh

코드를 다음과 같이 변경합니다.

#!/bin/bash

name=$1
echo "Hello, $name!"

여기서 name=$1은 $1 우편함에서 찾은 값을 name 상자에 넣습니다. 일시 중지도, 질문도 없습니다.

파일을 저장하고 편집기를 종료합니다.

인수를 사용해 스크립트 실행하기

이제 다른 방식으로 스크립트를 실행합니다. 스크립트를 시작할 때 이름을 스크립트에 바로 "던져" 주면 됩니다.

다음 명령을 실행합니다.

./hello.sh LabEx

여기서 LabEx가 인수입니다. 스크립트는 이 값을 $1로 가져와 즉시 다음을 출력합니다.

Hello, LabEx!

다른 이름으로도 실행해 봅니다.

./hello.sh World

이번에는 즉시 실행됩니다. 일시 중지하지 않습니다.

비어 있는 우편함 문제

인수를 지정하지 않으면 어떻게 될까요?

./hello.sh

다음과 같은 결과가 출력됩니다.

Hello, !

$1 우편함이 비어 있으므로 name 상자도 비어 있습니다. 이후 실습에서는 이 상황을 감지하고 오류 메시지를 표시하는 방법을 배웁니다. 지금은 간결하고 자동화에 사용할 수 있는 스크립트를 성공적으로 만들었습니다.

대화형 입력과 명령줄 인수의 차이는 매우 중요합니다. read는 실행 중에 입력을 요청하지만 $1은 스크립트가 시작되는 순간부터 사용할 수 있습니다. 많은 Unix 도구가 인수를 중심으로 설계된 이유는 인수가 자동화, 문서화, 반복 실행 및 다른 명령과의 결합에 더 편리하기 때문입니다.

요약

축하합니다! 이제 입력을 받는 방법을 배웠습니다.

이번 실습에서는 다음 내용을 확인했습니다.

  1. 대화형 모드: read를 사용해 사용자와 대화하며 입력을 받습니다 (사람이 직접 사용할 때 적합).
  2. 인수 모드: $1을 사용해 스크립트가 시작될 때 데이터를 전달받습니다 (로봇이나 자동화에 적합).

또한 $name과 같은 변수가 스크립트가 정보를 저장하는 이름 붙은 상자라는 것도 배웠습니다. 이 개념은 모든 프로그래밍의 기초입니다.