你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure CLI 命令可以在 Bash、PowerShell 和 Windows 命令行 (Cmd) 脚本语言中执行。 然而,存在微妙的脚本差异。 在此教程步骤中,学习如何创建您的第一个 Azure 存储账号,并为所有三种脚本语言格式化参数值。
先决条件
- 你已完成准备您的环境的先决条件。
- 您具有资源组级别
contributor
或更高级别权限的访问权限。
注意行延续字符
大多数 Azure CLI 文档都是在 Azure Cloud Shell 中使用 Bash 编写和测试的。 在复制 Azure CLI 语法时,首先要记住的一件事是检查所选脚本语言的行连接字符,因为它们不能互换。
脚本语言 | 换行符 |
---|---|
Bash | 反斜杠(\ ) |
PowerShell | 反引号 (` ) |
Cmd | 胡萝卜 (^ ) |
小窍门
Azure CLI 代码块右上角的复制按钮会有意移除反斜杠(\
)和反引号(`
)。 如果您想复制一个格式化的代码块,请使用键盘或鼠标来选择并复制示例。
理解使用变量时的语法差异
用于变量的语法在不同的脚本语言之间略有不同。 这里是一个比较:
用例 | Bash(Unix命令解释器) | PowerShell | Cmd |
---|---|---|---|
创建变量 | variableName=varValue | $variableName=“varValue” | 设置 variableName=varValue(将 variableName 设置为 varValue) |
使用变量作为参数值 | 变量名称 | $variableName | %variableName% |
在--query 参数中使用变量 |
“$variableName” | “$variableName” | “$variableName” |
有几种不同的方法可以将变量信息返回到控制台屏幕,但echo
在大多数情况下都有效。 这里是一个比较:
- Bash:输出$varResourceGroup
- PowerShell:echo $varResourceGroup
- Cmd: echo %varResourceGroup%
在步骤三中,Populate variables for use in scripts,你将深入学习变量语法的实例。
了解脚本语言中引用差异的内容
每个 Azure CLI 参数都是一个字符串。 然而,每种脚本语言都有其处理单引号和双引号、空格和参数值的规则。
字符串值 | Azure 命令行接口 (CLI) | PowerShell | Cmd |
---|---|---|---|
文本 | “text” 或 ‘text’ | “text” 或 ‘text’ | “text” |
编号 | \'50\' | “'50'” | “50” |
布尔型 | \'true\' | ''false'' | 真 |
日期 | 2021年11月15日 | 2021年11月15日 | 2021年11月15日 |
JSON(JavaScript 对象表示法) | '{“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存储账户以用于本教程。 本例为存储账户名称分配了一个随机ID,但如果您想使用其他名称,请参阅存储账户概述以了解存储账户名称规则。
重要
在您可以创建存储帐户之前,必须在您的订阅中注册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
参数接受以空格分隔的键值对列表。 将<msdocs-tutorial-rg-00000000>
替换为您的资源组的名称,将<msdocssa00000000>
替换为您的Azure存储帐户的名称。
# 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命令,并将--operation
参数设置为merge
。
# 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}}}'
示例为数字值筛选。 除非您在当前订阅中有虚拟机,否则此示例仅供将来参考。
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
...
如需更多故障排除技巧,请参阅Troubleshooting Azure CLI。
使用echo
命令
尽管--debug
准确地告诉你Azure CLI正在解释什么,第二个选项是将表达式的值返回到你的控制台。 此方法在验证--query
的结果时很有帮助,这已在为在脚本中使用而填充变量中详细介绍。
strExpression='{"key":"value"}'
echo $strExpression
{"key":"value"}
故障排除
当 Azure CLI 参考命令语法书写不当时,常见错误如下:
错误请求...{something}无效。可能是由于空格、单引号或双引号,或缺少引号导致的。
出现“意外的标记...”的情况通常是由于多余的空格或引号。
“Invalid jmespath_type value” 错误通常来自
--query
参数中的引号不正确。收到“变量引用无效”通常表示字符串未正确格式化,可能是因为串联或缺少转义字符导致的。
“无法识别的参数”通常是由于错误的行继续字符引起的。
一元运算符后缺少表达式,通常是因为缺少行连接符。
如需更多故障排除技巧,请参阅Azure CLI 命令疑难解答。
获取更多详细信息
您想了解本教程步骤中涉及的某个主题的更多详细信息吗? 请使用下表中的链接了解详细信息。
使用者 | 了解详细信息 |
---|---|
脚本差异 | 脚本语言之间的引号差异 |
Bash 引用规则 | |
PowerShell 引号规则 | |
使用 PowerShell 脚本语言运行 Azure CLI 的注意事项 | |
Windows 命令行技巧 | |
参数 | 在 Azure CLI 参数中使用引号 |
查找更多关于 Bash、PowerShell 和 Cmd 的语法示例,可参考 使用 JMESPath 查询命令输出。 | |
故障排除 | 排除 Azure CLI 命令故障 |
下一步
现在你已经学会了如何为 Bash、PowerShell 和 Cmd 编写 Azure CLI 语法,接下来请进入下一步学习如何将数值提取到变量中。