셸의 특수 변수

ShellBeginner
지금 연습하기

소개

이 실습에서는 셸 스크립팅의 특수 변수에 대해 배웁니다. 이러한 변수들은 명령줄 인자, 스크립트 이름, 프로세스 ID 와 같이 스크립트 실행 환경에 대한 필수적인 정보를 제공합니다. 이러한 변수들을 이해하면 더욱 유연하고 강력한 셸 스크립트를 작성하는 데 도움이 됩니다.

이 과정은 학습과 실습을 돕기 위해 단계별 지침을 제공하는 가이드 실습입니다. 각 단계를 주의 깊게 따라가며 직접 경험을 쌓아보세요. 통계에 따르면 이 실습은 초급 수준이며 99%의 완료율을 기록하고 있습니다. 또한 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

첫 번째 스크립트 만들기

특수 변수의 사용법을 확인하기 위해 간단한 셸 스크립트를 만드는 것부터 시작해 보겠습니다.

  1. WebIDE 에서 터미널을 엽니다. 입력을 기다리는 명령 프롬프트가 보일 것입니다.

  2. 프로젝트 디렉터리로 이동합니다.

cd ~/project

이 명령은 현재 디렉터리를 이번 실습의 기본 작업 디렉터리인 ~/project로 변경합니다.

  1. 다음 명령을 사용하여 special_vars.sh라는 새 파일을 생성합니다.
touch special_vars.sh

touch 명령은 파일이 존재하지 않으면 빈 파일을 생성하고, 이미 존재하면 타임스탬프를 업데이트합니다.

  1. WebIDE 에디터에서 파일을 엽니다. 화면 왼쪽의 파일 탐색기에서 파일 이름을 클릭하면 됩니다.

  2. 파일에 다음 내용을 추가합니다.

#!/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 를 제공합니다.
  1. 내용을 추가한 후 파일을 저장합니다.

  2. 터미널에서 다음 명령을 실행하여 스크립트에 실행 권한을 부여합니다.

chmod +x special_vars.sh

chmod 명령은 파일의 권한을 변경합니다. +x 옵션은 실행 권한을 추가하여 스크립트를 실행할 수 있게 합니다.

인자와 함께 스크립트 실행하기

스크립트를 만들었으니, 이제 다양한 인자를 전달하여 실행해 보면서 특수 변수들이 어떻게 작동하는지 확인해 보겠습니다.

  1. 인자 없이 스크립트를 실행합니다.
./special_vars.sh

스크립트 이름 앞의 ./는 셸에게 현재 디렉터리에서 스크립트를 찾으라고 지시합니다.

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

Script Name: ./special_vars.sh
First Argument:
Second Argument:
All Arguments:
Number of Arguments: 0
Process ID: 1234

인자를 제공하지 않았기 때문에 첫 번째와 두 번째 인자는 비어 있고, 인자 개수는 0 으로 표시되는 것을 확인할 수 있습니다.

  1. 이제 몇 가지 인자를 넣어서 스크립트를 실행해 봅니다.
./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($$) 는 운영 체제에서 할당하므로 스크립트를 실행할 때마다 달라질 수 있습니다.

$?$! 이해하기

또 다른 중요한 특수 변수는 $?$!입니다. 이들의 사용법을 확인하기 위해 새 스크립트를 만들어 보겠습니다.

  1. exit_status.sh라는 새 파일을 생성합니다.
touch ~/project/exit_status.sh
  1. WebIDE 에디터에서 파일을 열고 다음 내용을 추가합니다.
#!/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 를 제공합니다.
  • 명령 끝에 붙는 &는 해당 명령을 백그라운드에서 실행하도록 합니다.
  1. 파일을 저장하고 실행 권한을 부여합니다.
chmod +x ~/project/exit_status.sh
  1. 스크립트를 실행합니다.
./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 를 알려줍니다.

함수에서 특수 변수 사용하기

특수 변수는 함수 내부에서도 사용할 수 있습니다. 이를 확인하기 위한 스크립트를 만들어 보겠습니다.

  1. function_vars.sh라는 새 파일을 생성합니다.
touch ~/project/function_vars.sh
  1. WebIDE 에디터에서 파일을 열고 다음 내용을 추가합니다.
#!/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라는 함수를 정의합니다. 그런 다음 서로 다른 개수의 인자를 사용하여 이 함수를 두 번 호출합니다.

  1. 파일을 저장하고 실행 권한을 부여합니다.
chmod +x ~/project/function_vars.sh
  1. 스크립트를 실행합니다.
./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, $@, $#는 스크립트 인자와 마찬가지로 함수 인자에 대해서도 동일하게 작동합니다.
  • 이 변수들의 값은 함수가 다른 인자와 함께 호출될 때마다 변경됩니다.

$@와 $*의 차이점 이해하기

특수 변수 $@$*는 모두 모든 명령줄 인자를 나타내는 데 사용되지만, 큰따옴표로 묶었을 때 다르게 동작합니다. 이 차이점을 확인하기 위한 스크립트를 만들어 보겠습니다.

  1. at_vs_star.sh라는 새 파일을 생성합니다.
touch ~/project/at_vs_star.sh
  1. WebIDE 에디터에서 파일을 열고 다음 내용을 추가합니다.
#!/bin/bash

echo "Using \$@:"
for arg in "$@"; do
  echo "Argument: $arg"
done

echo "Using \$*:"
for arg in "$*"; do
  echo "Argument: $arg"
done

이 스크립트는 루프 내에서 $@$*를 사용할 때의 차이점을 보여줍니다.

  1. 파일을 저장하고 실행 권한을 부여합니다.
chmod +x ~/project/at_vs_star.sh
  1. 공백이 포함된 인자를 포함하여 여러 인자와 함께 스크립트를 실행합니다.
./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, $@, $#, $$, $?, $!와 같은 다양한 특수 변수의 사용법을 보여주는 스크립트를 직접 작성해 보았습니다. 또한 함수 내부나 명령줄 인자를 처리할 때와 같이 다양한 상황에서 이러한 변수들이 어떻게 동작하는지도 살펴보았습니다.

주요 학습 내용:

  1. $0, $1, $2 등은 스크립트 이름과 명령줄 인자를 나타냅니다.
  2. $@$#를 사용하면 모든 인자를 처리하고 개수를 셀 수 있습니다.
  3. $$는 현재 프로세스 ID 를 제공하며, 고유한 임시 파일을 생성할 때 유용합니다.
  4. $?는 이전 명령의 성공 여부를 확인하는 데 도움이 됩니다.
  5. $!는 마지막 백그라운드 프로세스의 PID 를 제공하며, 작업 제어에 유용합니다.
  6. $@$*는 따옴표로 묶었을 때 다르게 동작하며, 이는 공백이 포함된 인자를 다룰 때 중요합니다.

이러한 특수 변수를 이해하는 것은 더욱 고급스럽고 유연한 셸 스크립트를 작성하는 데 필수적입니다. 이를 통해 다양한 입력에 적응하고 스크립트 실행 환경에 대한 유용한 정보를 제공하는 스크립트를 만들 수 있습니다.

셸 스크립팅을 계속 연습하고 실험하다 보면, 업무에서 이러한 특수 변수를 활용하는 더 많은 방법을 찾게 될 것입니다. 이러한 변수 및 기타 특수 변수에 대한 자세한 정보는 bash 매뉴얼 (man bash) 을 참고하시기 바랍니다.