Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

PowerShell 변수 완벽 가이드: 생성부터 삭제까지

컴퓨터 과학에서 변수(variable)란 나중에 사용할 임의의 정보를 담아두는 메모리상의 위치를 말합니다. 쉽게 말해 데이터를 넣고 꺼낼 수 있는 임시 저장 용기입니다. Bash 셸에서는 이 데이터가 단어(문자열)일 수도 있고 숫자(정수)일 수도 있습니다.

컴퓨터에서 변수를 직접 사용해 본 적이 없더라도, 일상생활에서는 이미 변수와 비슷한 것을 자주 사용하고 있습니다. "저것 좀 줘" 또는 "이거 봐"라고 말할 때 여러분은 문법적 변수, 즉 대명사를 사용하는 것입니다. "이거"와 "저것"이 무엇을 의미하는지는 말하는 사람이 머릿속에 그리고 있는 대상이나 손으로 가리키는 대상에 따라 달라집니다. 수학을 할 때도 미지의 값을 나타내기 위해 변수를 사용하지만, 그것을 '변수'라고 부르지 않을 뿐입니다.

이 글은 Windows, Linux, Mac에서 실행되는 PowerShell의 변수를 다룹니다. 오픈소스 Bash 셸을 사용하는 분들은 Bash 변수에 관한 글을 참고하시면 됩니다. 다만 PowerShell 역시 Linux에서 실행할 수 있는 오픈소스 도구이므로, 이 글을 따라 하면서 학습할 수도 있습니다.

참고: 이 글의 예제는 오픈소스 운영체제인 Linux에서 실행 중인 PowerShell 세션 기준입니다. Windows나 Mac을 사용 중이라면 파일 경로가 다르게 표시됩니다. 그러나 Windows는 /를 자동으로 \로 변환해 주며, 모든 예제는 명백한 차이점(예: 사용자 이름이 seth일 가능성은 통계적으로 매우 낮음)만 바꾸면 모든 플랫폼에서 동작합니다.

변수는 어떤 용도로 사용될까?

PowerShell에서 변수가 필요한지 여부는 터미널에서 무엇을 하는지에 달려 있습니다. 어떤 사용자에게 변수는 데이터 관리의 필수 수단이지만, 다른 사용자에게는 사소하고 일시적인 편의 기능일 수 있으며, 심지어 없으나 마나한 존재일 수도 있습니다.

결국 변수는 하나의 도구입니다. 필요할 때 활용해도 되고, 운영체제가 알아서 관리한다는 안도감 속에 그냥 두어도 됩니다. 하지만 지식은 곧 힘입니다. PowerShell에서 변수가 어떻게 작동하는지 이해하면 예상치 못한 창의적인 문제 해결로 이어질 수 있습니다.

변수 설정하기

변수를 만들 때 특별한 권한은 필요 없습니다. 생성도 사용도 자유롭고, 대체로 무해합니다. PowerShell에서는 변수 이름을 정의한 뒤 Set-Variable 명령으로 값을 지정하여 변수를 생성합니다. 아래 예제는 FOO라는 새 변수를 만들고 그 값을 $HOME/Documents 문자열로 설정합니다:

PS> Set-Variable -Name FOO -Value "$HOME/Documents"

성공했을 때 아무런 출력이 없어 변수가 제대로 설정되었는지 확신하기 어려울 수 있습니다. Get-Variable(줄여서 gv) 명령으로 직접 확인할 수 있습니다. 변수가 정의된 그대로 정확히 읽히도록 따옴표로 감싸는 것도 좋습니다. 이렇게 하면 변수에 포함될 수 있는 특수 문자가 보존됩니다. 이 예제에서는 해당되지 않지만, 좋은 습관이니 참고하세요:

PS> Get-Variable "FOO" -valueOnly
/home/seth/Documents

FOO의 내용이 설정한 값과 정확히 같지 않다는 점에 주목하세요. 변수에 설정한 문자열은 $HOME/Documents였지만, 결과는 /home/seth/Documents로 표시됩니다. 이는 변수를 중첩해서 사용할 수 있기 때문입니다. $HOME 변수는 현재 사용자의 홈 디렉터리를 가리키며, Windows에서는 C:\Users, Linux에서는 /home, Mac에서는 /Users에 해당합니다. $HOMEFOO 안에 포함되어 있었기 때문에 호출 시점에 그 값이 확장(expansion)되는 것입니다. 이렇게 기본 변수를 활용하면 여러 플랫폼에서 동작하는 이식성 좋은 스크립트를 작성할 수 있습니다.

변수는 보통 한 시스템에서 다른 시스템으로 정보를 전달하기 위한 목적으로 사용됩니다. 이 간단한 예제에서 변수 자체는 크게 유용하지 않지만, 여전히 정보를 전달할 수 있습니다. 예를 들어 FOO 변수의 내용이 파일 경로이므로, FOO를 해당 디렉터리로 이동하는 바로 가기처럼 활용할 수 있습니다.

변수 자체가 아니라 변수의 내용을 참조하려면 변수 앞에 달러 기호($)를 붙입니다:

PS> pwd
/home/seth
PS> cd "$FOO"
PS> pwd
/home/seth/Documents

변수 삭제하기

Remove-Variable 명령으로 변수를 제거할 수 있습니다:

PS> Remove-Variable -Name "FOO"
PS> gv "FOO"
gv : Cannot find a variable with the name 'FOO'.
[...]

실제로는 변수를 굳이 삭제할 필요가 거의 없습니다. 변수는 생성 비용이 거의 없어서 더 이상 필요하지 않을 때 그냥 두면 됩니다. 다만, 해당 변수를 읽을 수 있는 다른 프로세스에 불필요한 정보가 전달되지 않도록 변수를 비워야 할 때가 있을 수 있습니다.

충돌 방지 기능으로 새 변수 생성하기

때때로 어떤 변수가 이미 본인이나 다른 프로세스에 의해 설정되어 있다고 의심될 수 있습니다. 기존 값을 덮어쓰고 싶지 않다면, 같은 이름의 변수가 이미 존재할 경우 실패하도록 설계된 New-Variable을 사용하거나, 조건문으로 먼저 변수의 존재 여부를 확인할 수 있습니다:

PS> New-Variable -Name FOO -Value "example"
New-Variable : A variable with name 'FOO' already exists.

참고: 이 예제들에서는 FOO/home/seth/Documents로 설정되어 있다고 가정합니다.

또는 간단한 if 문을 구성하여 기존 변수를 확인할 수도 있습니다:

PS> if ( $FOO ) 
>> { gv FOO } else
>> { Set-Variable -Name "FOO" -Value "quux" }

변수에 값 추가하기

변수를 덮어쓰는 대신 기존 변수에 값을 추가할 수도 있습니다. PowerShell의 변수에는 문자열, 정수, 배열 등 다양한 타입이 있습니다. 사실상 여러 개의 값을 가지는 변수를 만들려면, 문자로 구분된 문자열이 필요한지 아니면 배열이 필요한지 결정해야 합니다. 어느 쪽이든 크게 신경 쓰지 않을 수도 있지만, 변수 데이터를 받는 응용 프로그램이 특정 형식을 기대할 수 있으므로 대상에 맞춰 선택하는 것이 좋습니다.

문자열 변수에 데이터를 추가(append)하려면 += 구문을 사용합니다:

PS> gv FOO
foo
PS> $FOO += ",bar"
PS> gv FOO
foo,bar
PS> $FOO.getType().Name
String

배열은 PowerShell에서 특수한 타입의 변수로, ArrayList 객체가 필요합니다. 이는 PowerShell의 .NET 내부 구조를 더 깊이 파고들어야 하는 주제이므로 이 글의 범위를 벗어납니다.

환경 변수로 범위 넓히기

지금까지 이 글에서 만든 변수들은 모두 지역(local) 변수였습니다. 즉, 생성된 PowerShell 세션 안에서만 유효합니다. 다른 프로세스에서도 접근할 수 있는 변수를 만들려면 환경 변수(environment variable)를 사용해야 하는데, 이에 대해서는 다음 글에서 자세히 다루겠습니다.