about_If
about_If
조건이 참인지 거짓인지에 따라 if 문으로 다른 코드 블록을 골라서 실행하는 방법을 다뤄요. 조건 검사 하나로 시작해서, elseif와 else를 붙여 나갈수록 더 세밀하게 분기할 수 있죠.
본문
짧은 설명
조건 테스트 하나 또는 여러 개의 결과를 기준으로 명령문 목록을 실행할 수 있는 언어 명령을 설명해요.
자세한 설명
if 문은 지정한 조건 테스트가 **참(true)**으로 평가되면 코드 블록을 실행해요. 그리고 그 앞선 조건들이 모두 거짓(false)일 때 실행할 조건 테스트를 하나 더 붙일 수도 있고요, 마지막으로 앞선 어떤 조건 테스트도 참으로 평가되지 않을 때 실행되는 코드 블록을 따로 지정할 수 있어요.
정리하면 이렇게 갈라져요. 첫 조건이 참이면 그 블록이 실행되고, 아니면 다음 조건을 확인하고, 그것도 아니면 마지막 else 블록으로 떨어지죠.
구문
if (<test1>)
{<statement list 1>}
[elseif (<test2>)
{<statement list 2>}]
[else
{<statement list 3>}]
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
else {
Write-Host ("The value $a is less than or equal to 2," +
" is not created or is not initialized.")
}
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
elseif ($a -eq 2) {
Write-Host "The value $a is equal to 2."
}
else {
Write-Host ("The value $a is less than 2 or" +
" was not created or initialized.")
}
다음 예시는 if 문의 구문을 보여줘요.
if 문을 실행하면 PowerShell은 <test1> 조건식을 참인지 거짓인지 평가해요. <test1>이 참이면 <statement list 1>이 실행되고 PowerShell은 if 문을 빠져나와요. <test1>이 거짓이면 <test2> 조건문이 지정한 조건을 평가하죠.
불리언 평가에 대한 자세한 내용은 about_Booleans를 참고해요.
<test2>가 참이면 <statement list 2>가 실행되고, PowerShell은 if 문을 빠져나와요. <test1>과 <test2>가 모두 거짓으로 평가되면 <statement list 3> 코드 블록이 실행된 뒤 if 문이 끝나요.
elseif 문을 여러 개 붙이면 조건 테스트를 차례로 이어 붙일 수 있어요. 각 테스트는 앞선 모든 테스트가 거짓일 때만 실행돼요. 만약 elseif가 아주 많이 필요한 if 문이라면 switch 문을 쓰는 쪽을 고려해 보세요.
예시
가장 단순한 if 문은 명령 하나만 담고 있고 elseif 문이나 else 문은 전혀 없어요. 다음 예시가 그 가장 단순한 형태예요.
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
이 예시에서는 $a 변수가 2보다 크면 조건이 참으로 평가되고 명령문 목록이 실행돼요. 반대로 $a가 2보다 작거나 같거나, 존재하지 않는 변수라면 if 문은 아무 메시지도 표시하지 않아요.
else 문을 추가하면 $a가 2보다 작거나 같을 때도 메시지가 표시돼요. 다음 예시처럼요.
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
else {
Write-Host ("The value $a is less than or equal to 2," +
" is not created or is not initialized.")
}
여기에 elseif 문을 더 쓰면 $a 값이 정확히 2일 때 메시지를 별도로 보여줄 수 있어요. 다음 예시를 볼게요.
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
elseif ($a -eq 2) {
Write-Host "The value $a is equal to 2."
}
else {
Write-Host ("The value $a is less than 2 or" +
" was not created or initialized.")
}
삼항 연산자 구문 사용하기
<condition> ? <if-true> : <if-false>
PowerShell 7.0에서 C#의 삼항 연산자 구문을 닮은 새 구문이 도입됐어요.
삼항 연산자는 if-else 문을 간단하게 줄인 것처럼 동작해요. <condition> 식이 평가되고, 그 결과가 불리언으로 변환되어 다음에 어느 분기를 평가할지 정해져요.
예를 들어:
$message = (Test-Path $path) ? "Path exists" : "Path not found"
이 예시에서는 Test-Path가 $true를 돌려주면 $message 값이 Path exists가 돼요. Test-Path가 $false를 돌려주면 $message 값은 Path not found가 되죠.
$service = Get-Service BITS
$service.Status -eq 'Running' ? (Stop-Service $service) : (Start-Service $service)
이 예시에서는 서비스가 실행 중이면 멈추고, 상태가 Running이 아니면 시작해요.
<condition>이나 <if-true>, <if-false> 식이 명령을 호출한다면 그 명령을 괄호로 감싸야 해요. 감싸지 않으면 PowerShell이 <condition> 식의 명령에는 인수 예외를, <if-true>와 <if-false> 식에는 구문 분석 예외를 발생시켜요.
예를 들어 PowerShell은 이런 삼항 연산자들에 예외를 발생시켜요.
Test-Path .vscode ? Write-Host 'exists' : Write-Host 'not found'
(Test-Path .vscode) ? Write-Host 'exists' : Write-Host 'not found'
(Test-Path .vscode) ? (Write-Host 'exists') : Write-Host 'not found'
Test-Path: A positional parameter cannot be found that accepts argument '?'.
ParserError:
Line |
1 | (Test-Path .vscode) ? Write-Host 'exists' : Write-Host 'not found'
| ~
| You must provide a value expression following the '?' operator.
ParserError:
Line |
1 | (Test-Path .vscode) ? (Write-Host 'exists') : Write-Host 'not found'
| ~
| You must provide a value expression following the ':' operator.
그리고 이 예시는 정상적으로 구문 분석돼요.
(Test-Path .vscode) ? (Write-Host 'exists') : (Write-Host 'not found')
exists
명령이 포함된 세 식이 모두 괄호로 감싸졌으니, 조건 분기 모두가 문제없이 실행돼요.