瞭解Bash、PowerShell和 Cmd 中的 Azure CLI 語法差異

Azure CLI 命令可以在 Bash、PowerShell 和 Windows 命令殼層 (Cmd) 腳本語言中執行。 不過,有一個子腳本差異。 在本教學課程步驟中,瞭解如何針對這三種腳本語言建立第一個 Azure 儲存體 帳戶和格式參數值。

必要條件

  • 您已完成準備 環境的必要條件。
  • 您可以在資源群組層級具有 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%

在步驟三中, 填入變數以用於腳本,您可以深入探討變數語法的範例。

瞭解文稿語言之間的引號差異

每個 Azure CLI 參數都是字串。 不過,每個腳本語言都有自己的規則來處理單引號和雙引號、空格和參數值。

[字串值] Azure CLI PowerShell Cmd
Text 'text' 或 “text” 'text' 或 “text” "text"
數字 \'50\' ''50'' '50'
布林值 \'true\' ''false'' 'true'
Date '2021-11-15' '2021-11-15' '2021-11-15'
JSON '{“key”:“value”}' 或 “{”key“:”value“}” '{“key”: “value”}' 或 “{'”key'“: '”value'“}” 或 “{”“key”“: ”“value”}” “{”key“:”value“}”

許多 Azure CLI 參數都接受以空格分隔的值清單。 這會影響引用。

  • 未加上批注的空間分隔清單:--parameterName firstValue secondValue
  • 引號空格分隔清單:--parameterName “firstValue” “secondValue”
  • 包含空格的值:--parameterName “value1a value1b” “value2a value2b” “value3”

如果您不確定文本語言將如何評估字串,請將字串的值傳回控制台,或使用--debug偵錯 Azure CLI 參考命令中所述

建立記憶體帳戶以套用您已學到的內容

本教學課程步驟的其餘部分示範 Azure CLI 命令中的引用規則,並使用為 Azure CLI 準備您的環境中所建立的資源群組。 以您的資源群組名稱取代 <msdocs-tutorial-rg-00000000>

建立要在本教學課程中使用的 Azure 記憶體帳戶。 本範例會將隨機標識符指派給記憶體帳戶名稱,但如果您想要使用不同的名稱,請參閱 記憶體帳戶名稱規則的記憶體帳戶概觀

重要

您必須先在訂用帳戶中註冊資源提供者, Microsoft.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

注意

您剛收到「找不到訂用帳戶」錯誤嗎? 未在使用中訂用帳戶中註冊時 Microsoft.Storage ,就會發生此錯誤。 若要註冊資源提供者,請參閱 Azure 資源提供者和類型

建立新的記憶體帳戶時,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 記憶體帳戶名稱取代 <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"

如果您不想在完成本教學課程步驟時覆寫先前的標籤,請使用 az tag update 命令將 參數設定 --operationmerge

# 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 參數,可與任何命令搭配使用。 偵錯輸出很廣泛,但可提供您包括下列資訊:

  • 由文稿語言解譯的命令自變數 (參數值)
  • 記錄檔的位置
  • API 呼叫詳細數據
  • 執行錯誤

如果使用 Azure CLI 命令時,您遇到難以理解並更正執行錯誤的解答, --debug 就是您查看 Azure CLI 正在執行的步驟。

建立記憶體帳戶時,以下是偵錯輸出的一小部分:

 cli.knack.cli: Command arguments: ['storage', 'account', 'create', '--name', 'msdocssa00000000', '--resource-group', 'msdocs-rg-test', '--location', 'eastus', '--sku', 'Standard_RAGRS', '--kind', 'StorageV2', '--output', 'json', '--debug']
 ...
 cli.azure.cli.core.sdk.policies: Request URL: 'https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/checkNameAvailability?api-version=2023-01-01'
cli.azure.cli.core.sdk.policies: Request method: 'POST'
cli.azure.cli.core.sdk.policies: Request headers:
cli.azure.cli.core.sdk.policies:     'Content-Type': 'application/json'
cli.azure.cli.core.sdk.policies:     'Content-Length': '73'
cli.azure.cli.core.sdk.policies:     'Accept': 'application/json'
cli.azure.cli.core.sdk.policies:     'x-ms-client-request-id': '00000000-0000-0000-0000-000000000000'
cli.azure.cli.core.sdk.policies:     'CommandName': 'storage account create'
cli.azure.cli.core.sdk.policies:     'ParameterSetName': '--name --resource-group --location --sku --kind --output --debug'
cli.azure.cli.core.sdk.policies:     'User-Agent': 'AZURECLI/2.61.0 (DEB) azsdk-python-core/1.28.0 Python/3.11.8 (Linux-5.15.153.1-microsoft-standard-WSL2-x86_64-with-glibc2.35)'
cli.azure.cli.core.sdk.policies:     'Authorization': '*****'
cli.azure.cli.core.sdk.policies: Request body:
cli.azure.cli.core.sdk.policies: {"name": "msdocssa00000000", "type": "Microsoft.Storage/storageAccounts"}
urllib3.connectionpool: Starting new HTTPS connection (1): management.azure.com:443
urllib3.connectionpool: https://management.azure.com:443 "POST /subscriptions/00000000-0000-0000-0000-000000000000/providers/Microsoft.Storage/checkNameAvailability?api-version=2023-01-01 HTTP/1.1" 200 22
cli.azure.cli.core.sdk.policies: Response status: 200
...

如需更多疑難解答秘訣,請參閱 針對 Azure CLI 進行疑難解答。

使用 echo 命令

雖然 --debug 確切地告訴您 Azure CLI 正在解譯的內容,但第二個選項是將表達式的值傳回控制台。 驗證填入變數以在腳本中使用的詳細--query結果時,這個方法很有説明。

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

疑難排解

當 Azure CLI 參考命令語法未正確撰寫時,常見的錯誤如下:

  • 「不正確的要求...{something} 無效」可能是因為空格、單引號或雙引號或缺少引號所造成。

  • 「未預期的令牌...」當額外空間或引號時, 就會看到 。

  • 「無效jmespath_type值」錯誤通常來自 參數中的 --query 不正確引用。

  • 當字串因串連或遺漏逸出字元而無法正確格式化時,就會收到「變數參考無效」。

  • 「無法辨識的自變數」通常是由不正確的行接續字元所造成。

  • 遺漏行接續字元時,就會看到「一元運算符之後的遺漏表達式」。

如需其他疑難解答秘訣,請參閱 針對 Azure CLI 命令進行疑難解答。

取得更多詳細數據

您要針對本教學課程步驟中涵蓋的其中一個主題提供更多詳細數據嗎? 使用此表格中的連結來深入瞭解。

主體 深入了解
腳本差異 引用文本語言之間的差異
Bash 引用規則
PowerShell 引用規則
使用 PowerShell 腳本語言執行 Azure CLI 的考慮
Windows 命令行秘訣
參數 在 Azure CLI 參數中使用引號
使用 JMESPath 在查詢命令輸出中 尋找 Bash、PowerShell 和 Cmd 的更多語法範例
疑難排解 針對 Azure CLI 命令進行疑難解答

後續步驟

既然您已瞭解如何撰寫適用於Bash、PowerShell和 Cmd 的 Azure CLI 語法,請繼續進行下一個步驟,瞭解如何將值擷取至變數。