소개
이 실습에서는 셸 스크립팅의 특수 변수에 대해 배웁니다. 이러한 변수들은 명령줄 인자, 스크립트 이름, 프로세스 ID 와 같이 스크립트 실행 환경에 대한 필수적인 정보를 제공합니다. 이러한 변수들을 이해하면 더욱 유연하고 강력한 셸 스크립트를 작성하는 데 도움이 됩니다.
이 실습에서는 셸 스크립팅의 특수 변수에 대해 배웁니다. 이러한 변수들은 명령줄 인자, 스크립트 이름, 프로세스 ID 와 같이 스크립트 실행 환경에 대한 필수적인 정보를 제공합니다. 이러한 변수들을 이해하면 더욱 유연하고 강력한 셸 스크립트를 작성하는 데 도움이 됩니다.
특수 변수의 사용법을 확인하기 위해 간단한 셸 스크립트를 만드는 것부터 시작해 보겠습니다.
WebIDE 에서 터미널을 엽니다. 입력을 기다리는 명령 프롬프트가 보일 것입니다.
프로젝트 디렉터리로 이동합니다.
cd ~/project
이 명령은 현재 디렉터리를 이번 실습의 기본 작업 디렉터리인 ~/project로 변경합니다.
special_vars.sh라는 새 파일을 생성합니다.touch special_vars.sh
touch 명령은 파일이 존재하지 않으면 빈 파일을 생성하고, 이미 존재하면 타임스탬프를 업데이트합니다.
WebIDE 에디터에서 파일을 엽니다. 화면 왼쪽의 파일 탐색기에서 파일 이름을 클릭하면 됩니다.
파일에 다음 내용을 추가합니다.
#!/bin/bash
echo "Script Name: $0"
echo "First Argument: $1"
echo "Second Argument: $2"
echo "All Arguments: $@"
echo "Number of Arguments: $#"
echo "Process ID: $$"
각 줄이 수행하는 역할을 살펴보겠습니다.
#!/bin/bash: 이것은 쉬뱅 (shebang) 이라고 불립니다. 시스템이 이 스크립트를 해석할 때 bash 를 사용하도록 지시합니다.$0: 이 특수 변수는 스크립트의 이름을 담고 있습니다.$1 및 $2: 각각 첫 번째와 두 번째 명령줄 인자를 나타냅니다.$@: 스크립트에 전달된 모든 명령줄 인자를 나타냅니다.$#: 명령줄 인자의 개수를 알려줍니다.$$: 현재 셸의 프로세스 ID 를 제공합니다.내용을 추가한 후 파일을 저장합니다.
터미널에서 다음 명령을 실행하여 스크립트에 실행 권한을 부여합니다.
chmod +x special_vars.sh
chmod 명령은 파일의 권한을 변경합니다. +x 옵션은 실행 권한을 추가하여 스크립트를 실행할 수 있게 합니다.
스크립트를 만들었으니, 이제 다양한 인자를 전달하여 실행해 보면서 특수 변수들이 어떻게 작동하는지 확인해 보겠습니다.
./special_vars.sh
스크립트 이름 앞의 ./는 셸에게 현재 디렉터리에서 스크립트를 찾으라고 지시합니다.
다음과 유사한 출력이 나타날 것입니다.
Script Name: ./special_vars.sh
First Argument:
Second Argument:
All Arguments:
Number of Arguments: 0
Process ID: 1234
인자를 제공하지 않았기 때문에 첫 번째와 두 번째 인자는 비어 있고, 인자 개수는 0 으로 표시되는 것을 확인할 수 있습니다.
./special_vars.sh hello world
출력은 다음과 같아야 합니다.
Script Name: ./special_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Process ID: 1235
변경된 내용은 다음과 같습니다.
$1에 "hello"가 들어 있습니다.$2에 "world"가 들어 있습니다.$@는 모든 인자인 "hello world"를 보여줍니다.$#는 두 개의 인자를 제공했으므로 2 를 보여줍니다.프로세스 ID($$) 는 운영 체제에서 할당하므로 스크립트를 실행할 때마다 달라질 수 있습니다.
$? 와 $! 이해하기또 다른 중요한 특수 변수는 $?와 $!입니다. 이들의 사용법을 확인하기 위해 새 스크립트를 만들어 보겠습니다.
exit_status.sh라는 새 파일을 생성합니다.touch ~/project/exit_status.sh
#!/bin/bash
echo "Running a successful command:"
ls /home
echo "Exit status: $?"
echo "Running a command that will fail:"
ls /nonexistent_directory
echo "Exit status: $?"
echo "Running a background process:"
sleep 2 &
echo "Process ID of last background command: $!"
이 스크립트의 구성을 살펴보겠습니다.
$?는 마지막으로 실행된 명령의 종료 상태를 제공합니다. 0 은 보통 성공을 의미하며, 0 이 아닌 값은 다양한 오류 상태를 나타냅니다.$!는 마지막으로 실행된 백그라운드 명령의 프로세스 ID 를 제공합니다.&는 해당 명령을 백그라운드에서 실행하도록 합니다.chmod +x ~/project/exit_status.sh
./exit_status.sh
다음과 유사한 출력이 나타날 것입니다.
Running a successful command:
labex
Exit status: 0
Running a command that will fail:
ls: cannot access '/nonexistent_directory': No such file or directory
Exit status: 2
Running a background process:
Process ID of last background command: 1236
확인할 점:
ls 명령은 성공했으므로 $?는 0 입니다.ls 명령은 실패했으므로 (디렉터리가 존재하지 않음) $?는 2(오류를 나타내는 0 이 아닌 값) 입니다.sleep 명령은 백그라운드에서 실행되며, $!는 해당 프로세스 ID 를 알려줍니다.특수 변수는 함수 내부에서도 사용할 수 있습니다. 이를 확인하기 위한 스크립트를 만들어 보겠습니다.
function_vars.sh라는 새 파일을 생성합니다.touch ~/project/function_vars.sh
#!/bin/bash
function print_args {
echo "Function Name: $0"
echo "First Argument: $1"
echo "Second Argument: $2"
echo "All Arguments: $@"
echo "Number of Arguments: $#"
}
echo "Calling function with two arguments:"
print_args hello world
echo "Calling function with four arguments:"
print_args one two three four
이 스크립트는 특수 변수를 사용하는 print_args라는 함수를 정의합니다. 그런 다음 서로 다른 개수의 인자를 사용하여 이 함수를 두 번 호출합니다.
chmod +x ~/project/function_vars.sh
./function_vars.sh
다음과 유사한 출력이 나타날 것입니다.
Calling function with two arguments:
Function Name: ./function_vars.sh
First Argument: hello
Second Argument: world
All Arguments: hello world
Number of Arguments: 2
Calling function with four arguments:
Function Name: ./function_vars.sh
First Argument: one
Second Argument: two
All Arguments: one two three four
Number of Arguments: 4
확인할 점:
$0은 여전히 함수 이름이 아닌 스크립트 이름을 가리킵니다.$1, $2, $@, $#는 스크립트 인자와 마찬가지로 함수 인자에 대해서도 동일하게 작동합니다.특수 변수 $@와 $*는 모두 모든 명령줄 인자를 나타내는 데 사용되지만, 큰따옴표로 묶었을 때 다르게 동작합니다. 이 차이점을 확인하기 위한 스크립트를 만들어 보겠습니다.
at_vs_star.sh라는 새 파일을 생성합니다.touch ~/project/at_vs_star.sh
#!/bin/bash
echo "Using \$@:"
for arg in "$@"; do
echo "Argument: $arg"
done
echo "Using \$*:"
for arg in "$*"; do
echo "Argument: $arg"
done
이 스크립트는 루프 내에서 $@와 $*를 사용할 때의 차이점을 보여줍니다.
chmod +x ~/project/at_vs_star.sh
./at_vs_star.sh "arg with spaces" another_arg "third arg"
다음과 유사한 출력이 나타날 것입니다.
Using $@:
Argument: arg with spaces
Argument: another_arg
Argument: third arg
Using $*:
Argument: arg with spaces another_arg third arg
작동 원리는 다음과 같습니다.
"$@"를 사용하면 각 인자가 별개의 개체로 취급됩니다. 공백이 포함된 인자도 하나의 단위로 보존됩니다."$*"를 사용하면 모든 인자가 하나의 문자열로 합쳐지며, 각 인자는 IFS(Internal Field Separator) 변수의 첫 번째 문자 (보통 공백) 로 구분됩니다.이 차이점은 공백이나 기타 특수 문자가 포함될 수 있는 인자를 처리해야 할 때 매우 중요합니다.
이 실습에서는 셸 스크립팅의 특수 변수와 이를 효과적으로 사용하는 방법을 배웠습니다. $0, $1, $@, $#, $$, $?, $!와 같은 다양한 특수 변수의 사용법을 보여주는 스크립트를 직접 작성해 보았습니다. 또한 함수 내부나 명령줄 인자를 처리할 때와 같이 다양한 상황에서 이러한 변수들이 어떻게 동작하는지도 살펴보았습니다.
주요 학습 내용:
$0, $1, $2 등은 스크립트 이름과 명령줄 인자를 나타냅니다.$@와 $#를 사용하면 모든 인자를 처리하고 개수를 셀 수 있습니다.$$는 현재 프로세스 ID 를 제공하며, 고유한 임시 파일을 생성할 때 유용합니다.$?는 이전 명령의 성공 여부를 확인하는 데 도움이 됩니다.$!는 마지막 백그라운드 프로세스의 PID 를 제공하며, 작업 제어에 유용합니다.$@와 $*는 따옴표로 묶었을 때 다르게 동작하며, 이는 공백이 포함된 인자를 다룰 때 중요합니다.이러한 특수 변수를 이해하는 것은 더욱 고급스럽고 유연한 셸 스크립트를 작성하는 데 필수적입니다. 이를 통해 다양한 입력에 적응하고 스크립트 실행 환경에 대한 유용한 정보를 제공하는 스크립트를 만들 수 있습니다.
셸 스크립팅을 계속 연습하고 실험하다 보면, 업무에서 이러한 특수 변수를 활용하는 더 많은 방법을 찾게 될 것입니다. 이러한 변수 및 기타 특수 변수에 대한 자세한 정보는 bash 매뉴얼 (man bash) 을 참고하시기 바랍니다.