Powershell 의 모든 Variable(변수)는 .NET의 Type을 가지는데 지금 부터 설명할 Array는 Powershell에서 기본 값으로 System.Object[] 타입으로 생성된다.
배열 선언
간단한 Array부터 만들어 보자.
$Arr = "A", "B", "C" $Arr # A B C
다음과 같이 출력 될 것이다.
A B C
원소가 3개인 Object 배열 (Object[]) 이 생성되었다. 확인을 위해 다음을 하나씩 입력 해 보자.
$Arr.GetType() # Object[] $Arr.Count # 3 $Arr.Length # 3 $Arr[0] # A $Arr[2] # C Get-Member -InputObject $Arr
$Arr 개체가 타입이 Object[] 즉 배열로 생성이 되었고, Property들이 정상 작동 한다.
Powershell 에서 배열은 @( ) 연산자 를 이용하여 선언 할 수도 있다. 다음 선언 되는 2개의 변수는 동일 한 것이다(Compare-Object 기준).
$Arr1 = @("A1", "A2", "A3") $Arr2 = "A1", "A2", "A3" $Arr1.GetType() $Arr2.GetType() Compare-Object $Arr1 $Arr2
인덱스를 이용한 원소 접근
[] 또는 메서드와 인덱스를 통해 원소에 접근 할 수 있다.
인덱스는 0 부터 할당되어 원소가 3개인 경우 인덱스는 0 ~ 2 이다.
다음은 인덱스를 이용해 원소에 접근하고 값을 변경 한다.
$Arr = "A", "B", "C" $Arr.GetValue(1) # B $Arr[1] = "X" # 2 번째 원소의 값을 X로 변경 $Arr.Get(1) # X $Arr.Set(0, "Y") # 1 번째 원소의 값을 Y로 변경 $Arr[0] # Y
배열 순회
배열을 순회하는 방법에는 여러가지가 있다. 익숙한 for문과 인덱스를 이용하는 방법 이외에도 C#의 그것과 유사한 foreach 문, 그리고 Powershell 의 개체 파이프라인을 이용하는 방법이 있다. 다음 예제들은 모두 같은 출력을 가진다.
$Numbers = @( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 )
for ($index = 0; $index -lt $Numbers.Length; $index++) { $Numbers[$index] + 1 }
foreach ($item in $Numbers) { $item + 1 }
$Numbers | ForEach-Object { $_ + 1 }
배열 순회시 주의 사항
foreach 문이나 Pipeline 의 출력을 받는 ForEach-Object cmdlet 내부에서 배열의 원소값을 변경하는 실수를 범하지 말자. 이 것들은 iteration variable 이기 때문에 실제 원소들이 변경 되지 않는다.
$Numbers = @( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ) foreach ($item in $Numbers) { $item = 0 } $Numbers # 변함 없이 0 1 2 3 4 5 6 7 8 9
$Numbers = @( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ) $Numbers | ForEach-Object { $_++ } $Numbers # 변함 없이 0 1 2 3 4 5 6 7 8 9
순회 하면서 원소를 변경 할 때에는 for 문과 index를 사용 하는 것이 방법중 하나가 될 수 있다.
$Numbers = @( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ) for ($index = 0; $index -lt $Numbers.Length; $index++) { $Numbers[$index] ++ } $Numbers # 변경됨 : 1 2 3 4 5 6 7 8 9 10
배열 연산자
Powershell 에서의 배열은 몇가지 연산자를 지원 한다. 실제 .NET Object[] 에서는 지원하지 않는 기능인데 Powershell 에서는 편리하게 사용 할 수 있다.
+ : 하나의 원소를 또는 다른 배열을 합친 새로운 배열을 리턴한다.
$Alphabet = "Alpha", "Bravo" $Result = $Alphabet + "Charlie" $Result # "Alpha", "Bravo", "Charlie" $Result = $Alphabet + @("Delta", "Echo") $Result # "Alpha", "Bravo", "Delta", "Echo"
+= : 기존의 배열에 하나의 원소 또는 다른 배열을 추가한다. List 개체의 .Add() , .AddRange() 와 비슷 하다.
$Alphabet = "Alpha", "Bravo" $Alphabet += "Charlie" $Alphabet # "Alpha", "Bravo", "Charlie" $Alphabet += @("Delta", "Echo") $Alphabet # "Alpha", "Bravo", "Charlie", "Delta", "Echo"
* : 곱한 값 만큼 반복되는 배열을 리턴한다. (int 값만 가능하다.)
$Alphabet = "Alpha", "Bravo" $Result = $Alphabet * 2 $Result # "Alpha", "Bravo", "Alpha", "Bravo"
*= : 기존의 배열에 곱한 값 만큼 반복되는 배열(기존의 배열 포함)을 추가 시킨다. (int 값만 가능하다.)
$Alphabet = "Alpha", "Bravo" $Alphabet *= 2 $Alphabet # "Alpha", "Bravo", "Alpha", "Bravo"
야, 왜자꾸 파워쉘 이딴거 공부하냐
열심히 하는거 보니 보기 좋네.
쉘 언어 하나정도는 공부 해야 될꺼 같아서요 ^^ .
서버 관리나 개발 작업 하는데 사용하니까 도움이 많이 되는거 같아요.