스크립트에 인자 전달하기

ShellBeginner
지금 연습하기

소개

쉘 프로그래밍에서 스크립트에 인자를 전달하는 기능은 매우 기본적이면서도 강력한 기능입니다. 이를 통해 스크립트는 명령줄에서 입력을 받아 더욱 유연하고 재사용 가능해집니다. 이 랩에서는 명령줄 인자를 받아 사용할 수 있는 쉘 스크립트를 만드는 과정을 안내합니다. 스크립트 내에서 이러한 인자에 접근하는 방법, 여러 인자를 처리하는 방법, 그리고 특수 변수를 사용하여 효율적으로 처리하는 방법을 배우게 됩니다.

이 과정은 단계별 안내를 통해 학습과 실습을 돕는 가이드 랩입니다. 각 단계를 주의 깊게 따라가며 직접 경험을 쌓아보세요. 통계에 따르면 이 과정은 초급 수준이며, 96%의 수료율과 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

새로운 스크립트 파일 생성

먼저 새로운 스크립트 파일을 만드는 것부터 시작해 보겠습니다. 이번 실습에서는 WebIDE(VS Code) 를 사용합니다.

  1. WebIDE 가 열려 있지 않다면 엽니다.
  2. 왼쪽 파일 탐색기에서 /home/labex/project 디렉토리로 이동합니다.
  3. 파일 탐색기 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 "New File"을 선택합니다.
  4. 파일 이름을 arguments.sh로 지정합니다.

파일을 생성했으니, 이제 스크립트의 기본 구조를 추가해 보겠습니다.

#!/bin/bash

## Your code will go here

첫 번째 줄은 "쉬뱅 (shebang)" 또는 "해시뱅 (hashbang)"이라고 불립니다. 이는 시스템에 이 스크립트를 실행할 때 어떤 해석기 (interpreter) 를 사용할지 알려주는 역할을 합니다. 여기서는 bash 를 사용합니다.

초보자를 위한 팁: 쉬뱅 라인은 매우 중요합니다. 이 라인이 있으면 매번 bash arguments.sh라고 입력할 필요 없이 ./arguments.sh와 같이 스크립트를 직접 실행할 수 있기 때문입니다. 작은 디테일이지만 스크립트 사용을 훨씬 편리하게 만들어 줍니다.

스크립트 인자 접근하기

이제 전달된 인자에 접근하여 화면에 출력하도록 스크립트를 수정해 보겠습니다. 쉘 스크립팅에서는 명령줄 인자에 접근하기 위해 다음과 같은 특수 변수를 사용합니다.

  • $0: 스크립트 파일 자신의 이름
  • $1, $2, $3 등: 각각 첫 번째, 두 번째, 세 번째 인자

arguments.sh 파일에 다음 코드를 추가하세요.

#!/bin/bash

echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Third argument: $3"

이 스크립트는 스크립트 이름과 전달된 처음 세 개의 인자를 출력합니다.

초보자를 위한 팁:

  • bash 에서 변수를 참조할 때는 $ 기호를 사용합니다.
  • $0, $1, $2 등은 인자와 함께 스크립트를 실행할 때 bash 가 자동으로 설정해 주는 특수 변수입니다.
  • 인자 없이 스크립트를 실행하면 $1, $2, $3은 비어 있게 되지만, 스크립트는 오류 없이 실행됩니다.

스크립트에 실행 권한 부여

스크립트를 실행하기 전에 실행 가능하도록 권한을 변경해야 합니다. 이는 chmod 명령어를 사용합니다. 터미널에서 프로젝트 디렉토리로 이동하여 다음 명령어를 실행하세요.

cd /home/labex/project
chmod +x arguments.sh

chmod +x 명령어는 파일에 실행 권한을 추가하여 파일이 스크립트로 실행될 수 있게 합니다.

초보자를 위한 팁:

  • chmod는 "change mode"의 약자로, 파일이나 디렉토리의 권한을 변경할 때 사용합니다.
  • +x 옵션은 실행 (execute) 권한을 추가합니다. bash 가 파일을 스크립트로 실행하려면 이 권한이 반드시 필요합니다.
  • 이 단계를 생략하면 스크립트를 실행하려고 할 때 "permission denied(권한 거부)" 오류가 발생합니다.

인자와 함께 스크립트 실행

이제 스크립트가 실행 가능해졌으니, 몇 가지 인자를 넣어 실행해 보겠습니다. 터미널에서 다음 명령어를 입력하세요.

./arguments.sh hello world example

다음과 유사한 출력이 나타날 것입니다.

Script name: ./arguments.sh
First argument: hello
Second argument: world
Third argument: example

이 출력은 스크립트가 명령줄 인자에 성공적으로 접근하여 표시했음을 보여줍니다.

초보자를 위한 팁:

  • 스크립트 이름 앞의 ./는 bash 에게 현재 디렉토리에서 스크립트를 찾으라고 지시하는 것입니다.
  • 스크립트 이름 뒤에 오는 각 단어는 개별 인자가 됩니다. 이 경우 "hello"는 첫 번째, "world"는 두 번째, "example"은 세 번째 인자가 됩니다.
  • 공백이 포함된 내용을 하나의 인자로 전달하려면 ./arguments.sh "hello world" example과 같이 따옴표를 사용해야 합니다.

인자 개수 처리하기

전달된 인자의 개수에 따라 다르게 동작하도록 스크립트를 수정해 보겠습니다. 전달된 인자의 총 개수를 담고 있는 $# 특수 변수를 사용합니다.

arguments.sh 파일을 다음과 같이 업데이트하세요.

#!/bin/bash

if [ $## -eq 0 ]; then
  echo "No arguments provided."
elif [ $## -eq 1 ]; then
  echo "One argument provided: $1"
elif [ $## -eq 2 ]; then
  echo "Two arguments provided: $1 and $2"
else
  echo "More than two arguments provided:"
  echo "First argument: $1"
  echo "Second argument: $2"
  echo "Third argument: $3"
  echo "Total number of arguments: $#"
fi

이 스크립트는 조건문을 사용하여 인자 개수에 따라 다른 메시지를 출력합니다.

초보자를 위한 팁:

  • $#은 스크립트에 전달된 인자의 총 개수를 나타내는 특수 변수입니다.
  • [ $## -eq 0 ]은 인자의 개수가 0 과 같은지 확인하는 조건식입니다.
  • elif는 "else if"의 줄임말로, 여러 조건을 순차적으로 확인할 때 사용합니다.
  • -eq 연산자는 "equal to(~와 같다)"를 의미합니다. 이 외에도 -lt(less than, ~보다 작다), -gt(greater than, ~보다 크다) 등의 연산자가 있습니다.

업데이트된 스크립트 테스트

이제 인자 개수를 달리하여 업데이트된 스크립트를 테스트해 보겠습니다.

./arguments.sh
./arguments.sh one
./arguments.sh one two
./arguments.sh one two three four

제공된 인자의 개수에 따라 각기 다른 결과가 출력되는 것을 확인할 수 있습니다.

초보자를 위한 팁:

  • 인자 없이 실행하면 (./arguments.sh) 스크립트의 첫 번째 조건이 실행됩니다.
  • 명령어를 실행할 때마다 인자를 늘려가며 스크립트가 다양한 상황을 어떻게 처리하는지 확인해 보세요.
  • 인자 개수에 따라 스크립트의 동작이 변하는 이러한 유연성은 실제 환경에서 매우 유용하게 쓰입니다.

모든 인자 반복 처리하기

마지막으로, 모든 명령줄 인자를 나타내는 $@ 특수 변수를 사용하여 제공된 모든 인자를 루프 (반복문) 로 처리하도록 수정해 보겠습니다.

arguments.sh 파일을 다음과 같이 업데이트하세요.

#!/bin/bash

echo "Total number of arguments: $#"
echo "All arguments:"

count=1
for arg in "$@"; do
  echo "Argument $count: $arg"
  count=$((count + 1))
done

이 스크립트는 for 루프를 사용하여 모든 인자를 순회하며 각 인자의 위치와 내용을 출력합니다.

초보자를 위한 팁:

  • $@는 스크립트에 전달된 모든 인자를 포함하는 특수 변수입니다.
  • for 루프는 목록에 있는 항목들을 하나씩 순서대로 처리할 때 사용합니다. 여기서는 모든 인자를 하나씩 꺼내어 처리합니다.
  • $((count + 1))은 bash 의 산술 확장 기능입니다. count 변수의 값을 1 씩 증가시키는 데 사용됩니다.
  • 이 스크립트는 인자가 몇 개든 상관없이 작동하므로 이전 버전보다 훨씬 유연합니다.

최종 스크립트 테스트

여러 개의 인자를 넣어 최종 스크립트를 테스트해 보겠습니다.

./arguments.sh apple banana cherry date

다음과 유사한 출력이 나타날 것입니다.

Total number of arguments: 4
All arguments:
Argument 1: apple
Argument 2: banana
Argument 3: cherry
Argument 4: date

이제 스크립트가 인자 개수에 상관없이 모든 인자를 처리하고 표시할 수 있음을 확인할 수 있습니다.

초보자를 위한 팁:

  • 이 최종 버전의 스크립트는 초기 버전보다 훨씬 범용적입니다.
  • 인자가 없거나 아주 많아도 모두 대응할 수 있습니다.
  • 각 인자에 번호를 매겨 출력하는 방식은 복잡한 스크립트를 작성할 때 매우 유용한 기법입니다.
  • 다양한 개수의 인자를 넣어보며 스크립트가 어떻게 반응하는지 더 실험해 보세요.

요약

이 랩을 통해 명령줄 인자를 받아 처리할 수 있는 쉘 스크립트를 만드는 방법을 배웠습니다. 학습한 주요 개념은 다음과 같습니다.

  1. 스크립트 생성 및 실행 권한 부여 방법
  2. 특수 변수 ($1, $2 등) 를 사용한 개별 인자 접근
  3. $# 변수를 활용한 인자 개수 파악
  4. 인자 개수에 따른 조건부 로직 구현
  5. $@ 변수를 활용하여 모든 인자를 반복문으로 처리하는 방법

이러한 기술은 쉘 스크립팅의 기초이며, 다양한 입력에 적응할 수 있는 강력하고 유연한 스크립트를 만드는 밑거름이 됩니다. 쉘 스크립팅 실력을 쌓아갈수록, 시스템 관리나 자동화 작업에서 명령줄 인자를 처리하는 능력이 얼마나 중요한지 실감하게 될 것입니다.