Bash, PowerShell 및 Cmd의 Azure CLI 구문 차이점 알아보기

Azure CLI 명령은 Bash, PowerShell 및 Windows 명령 셸(Cmd) 환경 모두에서 실행할 수 있습니다. 그러나 하위 타일 스크립팅에는 차이가 있습니다. 이 자습서 단계에서는 첫 번째 Azure Storage 계정을 만들고 세 환경 모두에 대한 매개 변수 값의 서식을 지정하는 방법을 알아봅니다.

필수 조건

  • 환경을 준비하기 위한 필수 구성 요소를 완료했습니다.
  • 리소스 그룹 수준에서 사용 권한이 있는 리소스 그룹에 contributor 액세스할 수 있습니다.

줄 연속 문자에 주의

대부분의 Azure CLI 설명서는 Azure Cloud Shell을 사용하여 Bash에서 작성 및 테스트됩니다. Azure CLI 구문을 복사할 때 가장 먼저 기억해야 할 것 중 하나는 선택한 환경의 줄 연속 문자가 서로 교환할 수 없으므로 확인하는 것입니다.

환경 줄 연속 문자
Bash 백슬래시(\)
PowerShell 백틱(`)
Cmd 당근(^)

Azure CLI 코드 블록의 오른쪽 위 모서리에 있는 복사 단추는 백슬래시(\)와 백틱(`)을 의도적으로 제거합니다. 서식이 지정된 코드 블록을 복사하려면 키보드 또는 마우스를 사용하여 예제를 선택하고 복사합니다.

변수를 사용할 때 구문 차이점 이해

변수를 사용하는 구문은 환경마다 약간 다릅니다. 비교는 다음과 같습니다.

사용 사례 Bash PowerShell Cmd
변수 만들기 variableName=varValue $variableName="varValue" set variableName=varValue
변수를 매개 변수 값으로 사용 variableName $variableName %variableName%
매개 변수에 --query 변수 사용 '$variableName' '$variableName' '$variableName'

콘솔 화면에 변수 정보를 반환하는 방법에는 여러 가지가 있지만 echo 대부분의 경우 작동합니다. 비교는 다음과 같습니다.

  • Bash: 에코 $varResourceGroup
  • PowerShell: 에코 $varResourceGroup
  • Cmd: echo %varResourceGroup%

3 단계에서는 스크립트에서 사용할 변수를 채웁니다. 변수 구문의 자세한 예제를 살펴봅니다.

환경 간의 차이점을 따옴표로 묶는 방법에 대해 알아봅니다.

모든 Azure CLI 매개 변수는 문자열입니다. 그러나 각 환경에는 작은따옴표와 큰따옴표, 공백 및 매개 변수 값을 처리하는 고유한 규칙이 있습니다.

문자열 값 Azure CLI PowerShell Cmd
Text ‘text’ 또는 “text” ‘text’ 또는 “text” "text"
숫자 \'50\' ''50'' '50'
Boolean \'true\' ''false'' 'true'
날짜 '2021-11-15' '2021-11-15' '2021-11-15'
JSON '{"key":"value"}' 또는 "{"key":"value"}" '{"key":"value"}' "{"key":"value"}"

많은 Azure CLI 매개 변수는 공백으로 구분된 값 목록을 허용합니다. 이는 따옴표에 영향을 줍니다.

  • 따옴표가 지정되지 않은 공백으로 구분된 목록: --parameterName firstValue secondValue
  • 따옴표로 묶인 공백으로 구분된 목록: --parameterName "firstValue" "secondValue"
  • 공백을 포함하는 값: --parameterName "value1a value1b" "value2a value2b" "value3"

사용자 환경에서 문자열을 평가하는 방법을 잘 모르는 경우 문자열 값을 콘솔에 반환하거나 Azure CLI 참조 디버그 명령에 설명된 대로 사용합니다--debug.

배운 내용을 적용할 스토리지 계정 만들기

이 자습서 단계의 re기본der는 Azure CLI 명령의 따옴표 규칙을 보여 줍니다. Azure CLI에 대한 환경 준비에서 만든 리소스 그룹을 사용합니다. <msdocs-tutorial-rg-00000000> 리소스 그룹의 이름으로 대체합니다.

이 자습서에서 사용할 Azure Storage 계정을 만듭니다. 이 예제에서는 스토리지 계정 이름에 임의의 ID를 할당하지만 다른 이름을 사용하려면 스토리지 계정 이름 규칙에 대한 Storage 계정 개요를 참조하세요.

다음 스크립트 예제에서는 다음의 환경별 구문을 보여 줍니다.

  • 줄 연속
  • 가변 사용량
  • 임의 식별자
  • echo 명령
# Variable block
let "randomIdentifier=$RANDOM*$RANDOM"
location=eastus
resourceGroup="<msdocs-tutorial-rg-00000000>"
storageAccount="msdocssa$randomIdentifier"

# Create a storage account.
echo "Creating storage account $storageAccount in resource group $resourceGroup"
az storage account create --name $storageAccount \
                          --resource-group $resourceGroup \
                          --location $location \
                          --sku Standard_RAGRS \
                          --kind StorageV2 \
                          --output json

Azure CLI는 새 스토리지 계정을 만들 때 100줄이 넘는 JSON을 출력으로 반환합니다. 다음 JSON 사전 출력에는 간결성을 위해 생략된 필드가 있습니다.

{
"accessTier": "Hot",
"allowBlobPublicAccess": false,
"creationTime": "yyyy-mm-ddT19:14:26.962501+00:00",
"enableHttpsTrafficOnly": true,
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ msdocs-tutorial-rg-00000000/providers/Microsoft.Storage/storageAccounts/msdocssa00000000",
"keyCreationTime": {
  "key1": "yyyy-mm-ddT19:14:27.103127+00:00",
  "key2": "yyyy-mm-ddT19:14:27.103127+00:00"
},
"kind": "StorageV2",
"location": "eastus",
"name": "msdocssa00000000",
"primaryEndpoints": {
  "blob": "https://msdocssa00000000.blob.core.windows.net/"
},
"primaryLocation": "eastus",
"provisioningState": "Succeeded",
"resourceGroup": "msdocs-tutorial-rg-00000000",
"sku": {
  "name": "Standard_RAGRS",
  "tier": "Standard"
},
"statusOfPrimary": "available",
"statusOfSecondary": "available",
"tags": {},
"type": "Microsoft.Storage/storageAccounts"
}

따옴표 차이를 연습하는 태그 만들기

az storage account update를 사용하여 스토리지 계정을 식별하고 따옴표 차이에 대해 알아보는 데 도움이 되는 태그를 추가합니다. 이러한 스크립트 예제는 다음의 환경별 구문을 보여 줍니다.

  • 공백을 포함하는 값
  • 빈 공백 따옴표
  • 특수 문자 이스케이프
  • 변수 사용

매개 변수는 --tags 공백으로 구분된 키:값 쌍 목록을 허용합니다. 리소스 그룹의 <msdocssa00000000> 이름과 Azure Storage 계정의 이름으로 대체 <msdocs-tutorial-rg-00000000> 합니다.

# Create new tags. This syntax works with or without quotes around each key-value pair.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags Team=t1 Environment=e1

# Create new tags containing spaces. You must use quotes.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Floor number=f1" "Cost center=cc1"

# Create a new tag with an empty value.
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Department="''""

# Create a new tag containing special characters resulting in "Path": "$G:\\myPath".
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "Path=\$G:\myPath"

# Create a tag from a variable.
newTag="tag1=tag value with spaces"
az storage account update --name <msdocssa00000000> \
                          --resource-group <msdocs-tutorial-rg-00000000> \
                          --tags "$newTag"

이 자습서 단계를 진행하는 동안 이전 태그를 덮어쓰지 않으려면 매개 변수merge를 로 설정하는 --operation az tag update 명령을 사용합니다.

# Get the resource ID of your storage account.
saID=$(az resource show --resource-group <msdocs-tutorial-rg-00000000> \
                        --name <msdocssa00000000> \
                        --resource-type Microsoft.Storage/storageAccounts \
                        --query "id" \
                        --output tsv)

echo My storage account ID is $saID

# Append new tags.
az tag update --resource-id $saID \
              --operation merge \
              --tags <tagName>=<tagValue>

# Get a list of all tags.
az tag list --resource-id $saID

더 많은 환경별 스크립트 비교

이러한 스크립트 차이점을 자세히 살펴보세요. 다음 예제에서는 다음과 같은 따옴표로 묶는 차이점을 보여 줍니다.

  • JSON 문자열을 매개 변수 값으로 전달
  • 매개 변수를 사용하여 --query 결과 필터링
    • 숫자
    • 부울 값
    • 날짜

JSON 문자열을 포함하는 매개 변수의 예입니다. 이 스크립트는 이 자습서에서 작동하지 az rest 않으므로 향후 참조를 위해 제공됩니다.

az rest --method patch \
        --url https://management.azure.com/subscriptions/<mySubscriptionID>/resourceGroups/<myResourceGroup>/providers/Microsoft.HybridCompute/machines/<machineName>?api-version=yyyy-mm-dd-preview \
        --resource https://management.azure.com/ \
        --headers Content-Type=application/json \
        --body '{"properties": {"agentUpgrade": {"enableAutomaticUpgrade": false}}}'

숫자 값 필터링의 예입니다. 현재 구독에 VM이 없는 한 이 예제는 향후 참조를 위해 제공됩니다.

az vm list --resource-group <myResourceGroup> \
           --query "[?storageProfile.osDisk.diskSizeGb >=\`50\`].{Name:name, admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb}" \
           --output table

이 자습서에서 만든 스토리지 계정을 사용하여 부울 값을 필터링하는 예제입니다.

az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?allowBlobPublicAccess == \`true\`].id"

이 자습서에서 만든 스토리지 계정을 사용하여 날짜를 필터링하는 예제입니다.

# include time
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='2021-11-15T19:14:27.103127+00:00'].{saName:name, saID: id, sku: sku.name}"

# exclude time
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='2021-11-15'].{saName:name, saID: id, sku: sku.name}"

# subtract days and use a variable
saDate=$(date +%F -d "-30days")
az storage account list --resource-group <msdocs-tutorial-rg-00000000> \
    --query "[?creationTime >='$saDate'].{saName:name, saID: id, sku: sku.name}"

Azure CLI 참조 명령 디버그

매개 변수 사용 --debug

Azure CLI는 모든 명령과 함께 사용할 수 있는 매개 변수를 제공합니다 --debug . 디버그 출력은 광범위하지만 실행 오류에 대한 자세한 정보를 제공합니다. Bash clear 명령을 사용하여 테스트 간에 콘솔 출력을 제거합니다.

다음 예제에서는 Python 구문에서 Azure CLI에서 받은 실제 인수를 표시합니다.

이 예제는 Bash와 PowerShell 모두에서 정확합니다 .

az '{"key":"value"}' --debug

출력 줄에서 Azure CLI가 Command arguments 해석하는 내용을 확인합니다.

Command arguments: ['{"key":"value"}', '--debug']

이 두 번째 예제도 정확합니다. Bash clear 명령을 사용하여 테스트 간에 콘솔 출력을 제거합니다.

clear
az "{\"key\":\"value\"}" --debug
Command arguments: ['{"key":"value"}', '--debug']

다음 두 예제는 Bash에서 따옴표와 공백을 해석하기 때문에 잘못 되었습니다.

잘못된 형식 문제 콘솔 출력
az {"key":"value"} --debug 작은따옴표 또는 이스케이프 문자 누락 명령 인수: ['{key:value}', '--debug']
az {"key": "value"} --debug 작은따옴표 또는 이스케이프 문자가 누락되고 추가 공간이 포함되어 있습니다. 명령 인수: ['{key:', 'value}', '--debug']

명령 사용 echo

Azure CLI가 해석하는 내용을 정확히 알려주지만 --debug 두 번째 옵션은 식 값을 콘솔에 반환하는 것입니다. 이 메서드는 스크립트에서 사용하기 위해 채우기 변수에 자세히 설명된 결과를 --query 확인할 때 유용합니다.

strExpression='{"key":"value"}'
echo $strExpression
{"key":"value"}

문제 해결

Azure CLI 참조 명령 구문이 제대로 작성되지 않은 일반적인 오류는 다음과 같습니다.

  • "잘못된 요청 ... {something}이(가) 잘못되었습니다."는 공백, 작은따옴표 또는 큰따옴표 또는 따옴표 부족으로 인해 발생할 수 있습니다.

  • "예기치 않은 토큰..." 은 추가 공간 또는 따옴표가 있을 때 표시됩니다.

  • "잘못된 jmespath_type 값" 오류는 매개 변수의 잘못된 따옴표로 인해 --query 발생하는 경우가 많습니다.

  • 연결 또는 누락된 이스케이프 문자로 인해 문자열의 형식이 제대로 지정되지 않은 경우 "변수 참조가 유효하지 않습니다."가 수신됩니다.

  • "인식할 수 없는 인수"는 종종 잘못된 줄 연속 문자로 인해 발생합니다.

  • 줄 연속 문자가 누락된 경우 "단항 연산자 뒤의 식 누락"이 표시됩니다.

자세한 정보 가져오기

이 자습서 단계에서 다루는 주제 중 하나에 대해 자세히 알아보시겠습니까? 자세한 내용은 이 표의 링크를 사용합니다.

Subject 자세한 정보
스크립팅 차이점 Bash 따옴표
PowerShell 따옴표
PowerShell 관련 문제 인용
Windows 명령줄 팁
매개 변수 Azure CLI 매개 변수에서 따옴표 사용
JMESPath를 사용하여 쿼리 명령 출력에서 Bash, PowerShell 및 Cmd의 더 많은 구문 예제 찾기

다음 단계

이제 Bash, PowerShell 및 Cmd에 대한 Azure CLI 구문을 작성하는 방법을 배웠으므로 다음 단계를 진행하여 변수에 값을 추출하는 방법을 알아봅니다.