【发布时间】:2018-11-17 09:07:24
【问题描述】:
我正在创建一个 bash 脚本以通过 Azure CLI 预配多个 Azure 资源。到目前为止一切顺利,但是我在标记资源时遇到了问题。
我的目标是将多个标签存储在一个变量中,并将该变量提供给脚本中几个az 命令的--tags 选项。然而问题是值中的空格将被解释为新键。
如果我们以命令az group update(将更新资源组)为例,docs 会声明以下关于 --tags 选项的信息:
--tags'key[=value]' 格式的空格分隔标签。使用“”清除现有标签。
当一个值(或键)包含空格时,它必须用引号引起来。 因此,当我们将键值对直接提供给命令时,包括带有空格的值,如下例所示,结果将符合预期:
az group update --tags owner="FirstName LastName" application=coolapp --name resource-group-name
结果将是两个标签已添加到资源组:
{
"id": "/subscriptions/1e42c44c-bc55-4b8a-b35e-de1dfbcfe481/resourceGroups/resource-group-name",
"location": "westeurope",
"managedBy": null,
"name": "resource-group-name",
"properties": {
"provisioningState": "Succeeded"
},
"tags": {
"application": "coolapp",
"owner": "FirstName LastName"
}
}
但是,当我们将在上一步中使用的相同值存储在变量中时,就会出现问题。
tag='owner="FirstName LastName" application=coolapp'
我使用echo $tag 来验证变量是否包含与我们在上一个示例中提供给 --tags 选项的值完全相同的值:
owner="FirstName LastName" application=coolapp
但是当我们将这个标签变量提供给命令的标签选项时,如下一行所示:
az group update --tags $tag --name resource-group-name
结果将是三个标签,而不是预期的两个:
{
"id": "/subscriptions/1e42c44c-bc55-4b8a-b35e-de1dfbcfe481/resourceGroups/resource-group-name",
"location": "westeurope",
"managedBy": null,
"name": "resource-group-name",
"properties": {
"provisioningState": "Succeeded"
},
"tags": {
"LastName\"": "",
"application": "coolapp",
"owner": "\"FirstName"
}
}
我已经尝试通过以下方式定义变量,但到目前为止没有运气:
tag="owner=FirstName LastName application=coolapp"
tag=owner="Firstname Lastname" application=cool-name
tag='`owner="Firstname Lastname" application=cool-name`'
我什至尝试将变量定义为数组并将其提供给命令,如下一行所示,但也没有提供正确的结果:
tag=(owner="Firstname Lastname" application=cool-name)
az group update --tags ${tag[*]}--name resource-group-name
正如@socowi 所建议的那样,我还尝试在命令中的变量周围加上引号,但这会导致以下错误结果:一个标签而不是两个标签:
az group update --tags "$tag" --name resource-group-name
{
"id": "/subscriptions/1e42c44c-bc55-4b8a-b35e-de1dfbcfe481/resourceGroups/resource-group-name",
"location": "westeurope",
"managedBy": null,
"name": "resource-group-name",
"properties": {
"provisioningState": "Succeeded"
},
"tags": {
"owner": "Firstname Lastname application=cool-name"
}
}
有人知道怎么解决吗?
【问题讨论】:
-
感谢@Socowi,但我忘了在我的原始帖子中提到我已经尝试过了,但没有任何运气。将相应地更新帖子。
-
您找到了令人满意的解决方案吗?在这里尝试了无数种组合,但即使是公认的答案也不适合我
-
我怀疑解决方案(至少在 bash 下)是用
\替换标记值中的空格(用斜杠转义的空格),但祝你好运找到一种方法来使它在已经有多个引用和转义语法与字符串混淆的脚本。
标签: bash azure tagging azure-cli azure-resource-group