Bicep 中的資料類型
本文說明 Bicep 中支援的數據類型。 若要定義自訂資料類型,請參閱使用者定義的資料類型。
陣列
陣列開頭為左括弧 ([
),結尾為右括弧 (]
)。 在 Bicep 中,您可以在單行或多行中宣告陣列。 逗號 (,
) 會在單行宣告中的值之間使用,但不會用於多行宣告。 您可以混合並比對單行和多行宣告。 多行宣告需要 Bicep CLI 0.7.X 版或更新版本。
var multiLineArray = [
'abc'
'def'
'ghi'
]
var singleLineArray = ['abc', 'def', 'ghi']
var mixedArray = ['abc', 'def'
'ghi']
每個數位元素都可以是任何類型。 您的陣列各項目可皆為相同的資料類型,也可為不同的資料類型。
下列範例顯示整數位列和不同類型的陣列。
var integerArray = [
1
2
3
]
var mixedArray = [
resourceGroup().name
1
true
'example string'
]
Bicep 中的陣列是以零為基礎。 在下列範例中,運算式 exampleArray[0]
評估為 1,且 exampleArray[2]
評估為 3。 索引器索引可能是另一個表達式。 運算式 exampleArray[index]
評估為 2。 只有數位型別的運算式才允許整數索引器。
var index = 1
var exampleArray = [
1
2
3
]
當索引超出界限時,您會收到下列錯誤:
The language expression property array index 'x' is out of bounds
若要避免這個例外狀況,請使用 Or 邏輯運算符,如下列範例所示:
param emptyArray array = []
param numberArray array = [1, 2, 3]
output foo bool = empty(emptyArray) || emptyArray[0] == 'bar'
output bar bool = length(numberArray) <= 3 || numberArray[3] == 4
陣列相關運算子
- 使用 比較運算符 來比較兩個陣列。
- 使用 Index 存取子 從數位取得專案。
- 使用 Safe-dereference 運算符 來存取陣列的專案。
- 使用 Spread 合併陣列。
數位相關函式
布林值
當您指定布林值時,請使用 true
或 false
。 請勿用引號括住值。
param exampleBool bool = true
布爾值相關運算符
布爾值相關函式
請參閱 邏輯函式
整數
當您指定整數值時,請勿使用引號。
param exampleInt int = 1
Bicep 整數是 64 位整數。 當它們以內嵌參數的形式傳遞時,您用於部署的 SDK 或命令行工具可以限制值的範圍。 例如,當您使用 PowerShell 部署 Bicep 時,整數類型的範圍可以從 -2147483648 到2147483647。 若要避免這項限制,請在參數檔案中指定大整數值。 資源類型自身具有整數屬性的限制。
Bicep 支援整數常值類型,該類型參考特定值是確切的整數。 在下列範例中, 1
是整數常值類型, foo
只能指派值 1
,而沒有其他值。
output foo 1 = 1
您可以宣告內嵌的整數常值類型,如上述範例所示,或在語句中 type
宣告。
type oneType = 1
output foo oneType = 1
output bar oneType = 2
在上述範例中,指派 2
給 bar
會導致 BCP033 錯誤:「必須是 型 1
別的值,但提供的值為類型 2
。」
下列範例會使用具有 等位類型的整數常值類型:
output bar 1 | 2 | 3 = 3
目前不支援浮點、十進位或二進位格式。
整數相關運算符
整數相關函式
請參閱 數值函式。
物件
物件開頭為左大括弧 ({
),結尾為右大括弧 (}
)。 在 Bicep 中,您可以在單行或多行中宣告 物件。 物件中的每個屬性都包含索引鍵和值。 索引鍵和值以冒號 (:
) 分隔。 物件允許任何類型的任何屬性。 逗號 (,
) 會在單行宣告的屬性之間使用,但在多行宣告的屬性之間不會使用逗號。 您可以混合並比對單行和多行宣告。 多行宣告需要 Bicep CLI 0.7.X 版或更新版本。
param singleLineObject object = {name: 'test name', id: '123-abc', isCurrent: true, tier: 1}
param multiLineObject object = {
name: 'test name'
id: '123-abc'
isCurrent: true
tier: 1
}
param mixedObject object = {name: 'test name', id: '123-abc', isCurrent: true
tier: 1}
在 Bicep 中,物件屬性索引鍵上選擇性地允許引號:
var test = {
'my - special. key': 'value'
}
在上述範例中,當物件屬性索引鍵包含特殊字元時,會使用引號。 範例包括空白、 -
或 .
。 下列範例示範如何在物件屬性索引鍵中使用插補。
var stringVar = 'example value'
var objectVar = {
'${stringVar}': 'this value'
}
屬性存取子用於存取物件的屬性。 它們是使用運算符來建構的 .
。
var a = {
b: 'Dev'
c: 42
d: {
e: true
}
}
output result1 string = a.b // returns 'Dev'
output result2 int = a.c // returns 42
output result3 bool = a.d.e // returns true
您可以搭配任何物件使用屬性存取子,包括物件類型和物件常值的參數和變數。 在非物件類型的表示式上使用的屬性存取子是錯誤。
您也可使用 []
語法來存取屬性。 下列範例會傳回 Development
。
var environmentSettings = {
dev: {
name: 'Development'
}
prod: {
name: 'Production'
}
}
output accessorResult string = environmentSettings['dev'].name
在 JSON 中,對像是零個或多個索引鍵或值組的未排序集合。 順序可能會根據實作而有所不同。 例如,Bicep items() 函式會依字母順序排序物件。 在其他地方,您可以保留原始順序。 由於這種非決定性,因此當您撰寫程式代碼時,請避免對物件索引鍵的順序進行任何假設,這與部署參數和輸出互動。
當您存取物件的非存在屬性時,會收到下列錯誤:
The language expression property 'foo' doesn't exist
若要避免例外狀況,您可以使用 And 邏輯運算符,如下列範例所示:
param objectToTest object = {
one: 1
two: 2
three: 3
}
output bar bool = contains(objectToTest, 'four') && objectToTest.four == 4
對象相關運算符
- 使用 比較運算符 來比較物件。
- 使用 Index 存取子 從 物件取得屬性。
- 使用 Safe-dereference 運算符 來存取對象成員。
- 使用 Spread 合併物件。
物件相關函式
請參閱 物件函式。
字串
在 Bicep 中,字串會以單引號標示,而且您必須在單一行宣告它們。 允許在和 10FFFF
之間0
具有代碼點的所有 Unicode 字元。
param exampleString string = 'test value'
下表列出您必須使用反斜杠 (\
) 字元逸出的保留字元集:
逸出序列 | 表示值 | 備註 |
---|---|---|
\\ |
\ |
|
\' |
' |
|
\n |
換行字元 (LF) | |
\r |
歸位字元 (CR) | |
\t |
製表元 | |
\u{x} |
Unicode 字碼指標 x |
x 表示和 10FFFF 之間的0 十六進位字碼點值(兩者皆包含)。 允許以零開頭。 上述 FFFF 代碼點會發出為代理字組。 |
\$ |
$ |
僅限後面接著 { 時逸出。 |
// evaluates to "what's up?"
var myVar = 'what\'s up?'
Bicep 支援參考特定字串值的字串常值類型。 在下列範例中, red
是字串常值類型。 您只能將值 red
指定給 redColor
。
output redColor 'red' = 'red'
您可以宣告內嵌字串常值類型,如上述範例所示,或在語句中type
宣告。
type redColor = 'red'
output colorRed redColor = 'red'
output colorBlue redColor = 'blue'
在上述範例中,指派 blue
給 colorBlue
會導致 BCP033 錯誤:「必須是 型 red
別的值,但提供的值為類型 blue
。」
下列範例顯示搭配 等位型別使用的字串常值型別:
type direction = 'north' | 'south' | 'east' | 'west'
output west direction = 'west'
output northWest direction = 'northwest'
Bicep 中的所有字串皆支援插補。 若要插入運算式,請在其前後使用 ${
和 }
。 參考的運算式不可跨越多行。
var storageName = 'storage${uniqueString(resourceGroup().id)}'
多行字串
在 Bicep 中,多行字串會在三個單引號 () 之間定義,然後選擇性地以換行符 ('''
開頭序列) 和三個單引號 ('''
是結尾序列)。 在開頭和結尾序列之間輸入的字元會逐字讀取。 不需要或可能逸出。
注意
Bicep 剖析器會依原樣讀取每個字元。 視 Bicep 檔案的行尾結束符而定,換行符會解譯為 \r\n
或 \n
。
多行字串目前不支援插補。 由於這項限制,您可能需要使用 函 concat
式,而不是使用 插補。
不支援包含 '''
的多行字串。
// evaluates to "hello!"
var myVar = '''hello!'''
// evaluates to "hello!" because the first newline is skipped
var myVar2 = '''
hello!'''
// evaluates to "hello!\n" because the final newline is included
var myVar3 = '''
hello!
'''
// evaluates to " this\n is\n indented\n"
var myVar4 = '''
this
is
indented
'''
// evaluates to "comments // are included\n/* because everything is read as-is */\n"
var myVar5 = '''
comments // are included
/* because everything is read as-is */
'''
// evaluates to "interpolation\nis ${blocked}"
// note ${blocked} is part of the string, and is not evaluated as an expression
var myVar6 = '''interpolation
is ${blocked}'''
字串相關運算符
- 請參閱 比較運算符。
字串相關函式
等位型別
在 Bicep 中,等位類型允許建立由一組子類型組成的合併類型。 如果允許任何個別子類型指派,則指派有效。 |
字元會分隔使用or
條件的個別子類型。 例如,語法 a | b
表示有效的指派可以是 a
或 b
。 等位型別會轉譯成 Bicep 中允許值限制式,因此只有常值可以做為成員。 等位可能包含任意數目的常值型別運算式。
type color = 'Red' | 'Blue' | 'White'
type trueOrFalse = 'true' | 'false'
type permittedIntegers = 1 | 2 | 3
type oneOfSeveralObjects = {foo: 'bar'} | {fizz: 'buzz'} | {snap: 'crackle'}
type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]
類型等位必須可縮減為單一 Azure Resource Manager 類型,例如 string
、 int
或 bool
。 否則,您會取得 BCP294 錯誤碼。 例如:
type foo = 'a' | 1
您可以在等位型別宣告中使用任何類型的運算式作為子類型(在字元之間 |
)。 例如,下列範例都是有效的:
type foo = 1 | 2
type bar = foo | 3
type baz = bar | (4 | 5) | 6
自訂標記聯集數據類型
Bicep 支援自定義標記聯集數據類型,代表可以是數種類型之一的值。 若要宣告自定義標記聯集數據類型,您可以使用 @discriminator()
裝飾專案。 需要 Bicep CLI 0.21.X 版或更新版本才能使用此裝飾專案。 語法為:
@discriminator('<property-name>')
鑑別子屬性裝飾項目會採用單一參數,代表所有集合聯集成員之間的共用屬性名稱。 此屬性名稱必須是所有成員的必要字串常值,而且區分大小寫。 等位成員上鑑別子屬性的值必須是唯一的,且不區分大小寫。
type FooConfig = {
type: 'foo'
value: int
}
type BarConfig = {
type: 'bar'
value: bool
}
@discriminator('type')
param ServiceConfig FooConfig | BarConfig | { type: 'baz', *: string } = { type: 'bar', value: true }
參數值會根據鑑別子屬性的屬性值進行驗證。 例如,在上述範例中,如果 serviceConfig
參數的類型為 foo
,則會使用 FooConfig
型別進行驗證。 同樣地,如果 參數的類型為 bar
,則會使用 BarConfig
型別進行驗證。 此模式也適用於其他類型。
等位類型有一些限制:
聯集類型必須可減少為單一 Azure Resource Manager 類型。 下列定義無效:
type foo = 'a' | 1
只有常值可以做為成員。
所有常值都必須是相同的基本數據類型(例如,所有字串或所有整數)。
您可以在使用者定義資料類型中使用 等位型別語法。
安全字串和物件
安全字串使用與字串相同的格式,而安全物件會使用與物件相同的格式。 使用 Bicep 時,您會將@secure()
裝飾專案新增至字串或物件。
當您將參數設定為安全字串或安全物件時,參數的值不會儲存至部署歷程記錄或記錄。 如果您將該安全值設定為非預期安全值的屬性,則不會保護該值。 例如,若將安全字串設為標記,該值便會儲存為純文字。 密碼及秘密請使用安全字串。
下列範例示範兩個安全參數:
@secure()
param password string
@secure()
param configValues object
資料類型的可指派性
在 Bicep 中,您可以將某個類型(來源類型)的值指派給另一個類型(目標類型)。 下表顯示您可以或無法指派哪些來源類型(水準列出)的目標類型(垂直列出)。 在資料表中, X 表示可指派,空白空間表示不可指派,而 ? 表示只有在類型相容時。
類型 | any |
error |
string |
number |
int |
bool |
null |
object |
array |
具名資源 | 具名模組 | scope |
---|---|---|---|---|---|---|---|---|---|---|---|---|
any |
X | X | X | X | X | X | X | X | X | X | X | |
error |
||||||||||||
string |
X | X | ||||||||||
number |
X | X | X | |||||||||
int |
X | X | ||||||||||
bool |
X | X | ||||||||||
null |
X | X | ||||||||||
object |
X | X | ||||||||||
array |
X | X | ||||||||||
resource |
X | X | ||||||||||
module |
X | X | ||||||||||
scope |
? | |||||||||||
具名資源 | X | ? | ? | |||||||||
具名模組 | X | ? | ? |
下一步
若要瞭解 Bicep 的結構和語法,請參閱 Bicep 檔案結構和語法。