Datentypen in Bicep
In diesem Artikel werden die Datentypen beschrieben, die in Bicep unterstützt werden. Informationen zum Definieren benutzerdefinierter Datentypen finden Sie unter Benutzerdefinierte Datentypen.
Arrays
Arrays beginnen mit einer linken eckigen Klammer ([
) und enden mit einer rechten eckigen Klammer (]
). In Bicep können Sie ein Array in einer einzelnen Zeile oder in mehreren Zeilen deklarieren. Kommas (,
) werden zwischen Werten in einzeiligen Deklarationen verwendet, werden jedoch nicht in mehrzeiligen Deklarationen verwendet. Sie können einzeilige und mehrzeilige Deklarationen kombinieren. Für mehrzeilige Deklarationen ist Bicep CLI Version 0.7.X oder höher erforderlich.
var multiLineArray = [
'abc'
'def'
'ghi'
]
var singleLineArray = ['abc', 'def', 'ghi']
var mixedArray = ['abc', 'def'
'ghi']
Jedes Arrayelement kann beliebiger Art sein. Sie können über ein Array verfügen, in dem jedes Element denselben Datentyp hat, oder ein Array, das unterschiedliche Datentypen enthält.
Das folgende Beispiel zeigt ein Array von ganzen Zahlen und ein Array unterschiedlicher Typen.
var integerArray = [
1
2
3
]
var mixedArray = [
resourceGroup().name
1
true
'example string'
]
Arrays in Bicep basieren auf Null. Beispielsweise ergibt der Ausdruck exampleArray[0]
den Wert 1 und exampleArray[2]
entspricht 3. Der Index des Indexers kann ein anderer Ausdruck sein. Der Ausdruck exampleArray[index]
wird zu 2 ausgewertet. Ganzzahlige Indexer sind nur für den Ausdruck von Arraytypen zulässig.
var index = 1
var exampleArray = [
1
2
3
]
Die folgende Fehlermeldung wird angezeigt, wenn der Index außerhalb der Grenzen liegt:
The language expression property array index 'x' is out of bounds
Um diese Ausnahme zu vermeiden, verwenden Sie den logischen Operator "Or", wie im folgenden Beispiel gezeigt:
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
Arraybezogene Operatoren
- Verwenden Sie Vergleichsoperatoren , um zwei Arrays zu vergleichen.
- Verwenden Sie den Indexaccessor , um ein Element aus einem Array abzurufen.
- Verwenden Sie den Safe-Dereference-Operator , um auf Elemente eines Arrays zuzugreifen.
- Verwenden Sie "Spread ", um Arrays zusammenzuführen.
Arraybezogene Funktionen
- Siehe Arrayfunktionen.
- Siehe Lambda-Funktionen.
Boolesche Werte
Wenn Sie boolesche Werte angeben, verwenden true
oder false
. Umschließen Sie den Wert nicht mit Anführungszeichen.
param exampleBool bool = true
Boolesche Operatoren
- Verwenden Sie Vergleichsoperatoren , um boolesche Werte zu vergleichen.
- Siehe logische Operatoren.
Boolesche Funktionen
Siehe Logische Funktion
Ganze Zahlen
Wenn Sie ganzzahlige Werte angeben, verwenden Sie keine Anführungszeichen.
param exampleInt int = 1
Bicep ganze Zahlen sind 64-Bit-Ganzzahlen. Wenn sie als Inlineparameter übergeben werden, kann das FÜR die Bereitstellung verwendete SDK- oder Befehlszeilentool den Wertebereich einschränken. Wenn Sie beispielsweise PowerShell zum Bereitstellen von Bicep verwenden, können ganzzahlige Typen von -2147483648 bis 2147483647 reichen. Um diese Einschränkung zu vermeiden, geben Sie große ganzzahlige Werte in einer Parameterdatei an. Ressourcentypen wenden ihre eigenen Grenzwerte für Integereigenschaften an.
Bicep unterstützt einen ganzzahligen Literaltyp, der auf einen bestimmten Wert verweist, der eine genaue ganze Zahl ist. Im folgenden Beispiel 1
handelt es sich um einen ganzzahligen Literaltyp und foo
kann nur dem Wert 1
und keinem anderen Wert zugewiesen werden.
output foo 1 = 1
Sie können einen ganzzahligen Literaltyp entweder inline deklarieren, wie im vorherigen Beispiel gezeigt, oder in einer type
Anweisung.
type oneType = 1
output foo oneType = 1
output bar oneType = 2
Im vorherigen Beispiel 2
wird ein BCP033-Fehler zugewiesenbar
: "Es wurde ein Wert vom Typ 1
erwartet, der angegebene Wert ist jedoch vom Typ2
".
Im folgenden Beispiel wird ein ganzzahliger Literaltyp mit einem Union-Typ verwendet:
output bar 1 | 2 | 3 = 3
Gleitkomma-, Dezimal- oder Binärformate werden derzeit nicht unterstützt.
Ganzzahlige Operatoren
- Siehe Vergleichsoperatoren.
- Siehe numerische Operatoren.
Ganzzahlige Funktionen
Siehe numerische Funktionen.
Objekte
Objekte beginnen mit einer linken geschweiften Klammer ({
) und enden mit einer rechten geschweiften Klammer (}
). In Bicep können Sie ein Objekt in einer einzelnen Zeile oder in mehreren Zeilen deklarieren. Jede Eigenschaft in einem Objekt besteht aus einem Schlüssel und einem Wert. Der Schlüssel und der Wert werden durch einen Doppelpunkt (:
) getrennt. Ein Objekt lässt beliebige Eigenschaften jedes Typs zu. Kommas (,
) werden zwischen Eigenschaften für einzeilige Deklarationen verwendet, werden jedoch nicht zwischen Eigenschaften für mehrzeilige Deklarationen verwendet. Sie können einzeilige und mehrzeilige Deklarationen kombinieren. Für mehrzeilige Deklarationen ist Bicep CLI Version 0.7.X oder höher erforderlich.
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}
In Bicep sind Anführungszeichen optional für Objekteigenschaftsschlüssel zulässig:
var test = {
'my - special. key': 'value'
}
Im vorherigen Beispiel werden Anführungszeichen verwendet, wenn die Objekteigenschaftsschlüssel Sonderzeichen enthalten. Beispiele sind Leerzeichen, -
oder .
. Das folgende Beispiel zeigt, wie Sie die Interpolation in Objekt-Eigenschaftsschlüsseln verwenden können.
var stringVar = 'example value'
var objectVar = {
'${stringVar}': 'this value'
}
Eigenschaftenaccessoren werden verwendet, um auf Eigenschaften eines Objekts zuzugreifen. Sie werden mithilfe des .
Operators erstellt.
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
Sie können Eigenschaftsaccessoren mit jedem Objekt verwenden, einschließlich Parametern und Variablen von Objekttypen und Objektliteralen. Ein Eigenschaftsaccessor, der für einen Ausdruck eines Nichtobjekttyps verwendet wird, ist ein Fehler.
Sie können auch die Syntax []
für den Zugriff auf eine Eigenschaft verwenden. Im folgenden Beispiel wird Development
zurückgegeben.
var environmentSettings = {
dev: {
name: 'Development'
}
prod: {
name: 'Production'
}
}
output accessorResult string = environmentSettings['dev'].name
In JSON ist ein Objekt eine ungeordnete Auflistung von Null- oder mehr Schlüssel- oder Wertpaaren. Die Sortierung kann je nach Implementierung unterschiedlich sein. Beispielsweise sortiert die Bicep items() -Funktion die Objekte in alphabetischer Reihenfolge. An anderen Stellen können Sie die ursprüngliche Reihenfolge beibehalten. Vermeiden Sie aufgrund dieses Nichtdeterminismus beim Schreiben von Code, der mit Bereitstellungsparametern und Ausgaben interagiert, annahmen über die Anordnung von Objektschlüsseln.
Sie erhalten den folgenden Fehler, wenn Sie auf eine nicht vorhandene Eigenschaft eines Objekts zugreifen:
The language expression property 'foo' doesn't exist
Um die Ausnahme zu vermeiden, können Sie den logischen Operator "And" verwenden, wie im folgenden Beispiel gezeigt:
param objectToTest object = {
one: 1
two: 2
three: 3
}
output bar bool = contains(objectToTest, 'four') && objectToTest.four == 4
Objektbezogene Operatoren
- Verwenden Sie Vergleichsoperatoren, um Objekte zu vergleichen.
- Verwenden Sie den Index-Accessor , um eine Eigenschaft aus einem Objekt abzurufen.
- Verwenden Sie den Safe-Dereference-Operator , um auf Objektmmber zuzugreifen.
- Verwenden Sie "Spread ", um Objekte zusammenzuführen.
Objektbezogene Funktionen
Siehe Objektfunktionen.
Zeichenfolgen
In Bicep werden Zeichenfolgen mit einfachen Anführungszeichen markiert, und Sie müssen sie in einer einzelnen Zeile deklarieren. Alle Unicode-Zeichen mit Codepunkten zwischen 0
und 10FFFF
sind zulässig.
param exampleString string = 'test value'
In der folgenden Tabelle sind die reservierten Zeichen aufgeführt, die sie mithilfe eines umgekehrten Schrägstrichs (\
) escapen müssen:
Escapesequenz | Dargestellter Wert | Notizen |
---|---|---|
\\ |
\ |
|
\' |
' |
|
\n |
Zeilenvorschub (LF) | |
\r |
Wagenrücklauf (CR) | |
\t |
Tabstoppzeichen | |
\u{x} |
Unicode-Codepunkt x |
Dies x stellt einen Hexadezimalcodepunktwert zwischen 0 und 10FFFF (beide einschließlich) dar. Führende Nullen sind zulässig. Codepunkte oben FFFF werden als Ersatzpaar ausgegeben. |
\$ |
$ |
Nur escapen, wenn von { gefolgt. |
// evaluates to "what's up?"
var myVar = 'what\'s up?'
Bicep unterstützt einen Zeichenfolgenliteraltyp, der auf einen bestimmten Zeichenfolgenwert verweist. Im folgenden Beispiel red
handelt es sich um einen Zeichenfolgenliteraltyp. Sie können den Wert red
redColor
nur zuweisen.
output redColor 'red' = 'red'
Sie können einen Zeichenfolgenliteraltyp entweder inline deklarieren, wie im vorherigen Beispiel gezeigt, oder in einer type
Anweisung.
type redColor = 'red'
output colorRed redColor = 'red'
output colorBlue redColor = 'blue'
Im vorherigen Beispiel blue
wird ein BCP033-Fehler zugewiesencolorBlue
: "Es wurde ein Wert vom Typ red
erwartet, der angegebene Wert ist jedoch vom Typblue
".
Das folgende Beispiel zeigt einen Zeichenfolgenliteraltyp, der mit einem Union-Typ verwendet wird:
type direction = 'north' | 'south' | 'east' | 'west'
output west direction = 'west'
output northWest direction = 'northwest'
Alle Zeichenfolgen in Bicep unterstützen Interpolation. Um einen Ausdruck einzufügen, umschließen Sie ihn mit ${
und }
. Ausdrücke, auf die verwiesen wird, können sich nicht über mehrere Zeilen erstrecken.
var storageName = 'storage${uniqueString(resourceGroup().id)}'
Mehrzeilige Zeichenfolgen
In Bicep werden mehrzeilige Zeichenfolgen zwischen drei einfachen Anführungszeichen ('''
) definiert, gefolgt optional durch eine Neueinführung (die öffnende Sequenz) und drei einfache Anführungszeichen ('''
ist die schließende Sequenz). Zeichen, die zwischen der öffnenden und schließenden Sequenz eingegeben werden, sind schreibgeschützt. Escaping ist nicht erforderlich oder möglich.
Hinweis
Der Bicep-Parser liest alle Zeichen wie folgt vor. Je nach den Zeilenabschluss Ihrer Bicep-Datei werden Neuelines als entweder \r\n
oder \n
.
Interpolation wird derzeit in mehrzeiligen Zeichenfolgen nicht unterstützt. Aufgrund dieser Einschränkung müssen Sie möglicherweise die concat
Funktion anstelle der Interpolation verwenden.
Mehrzeilige Zeichenfolgen, die enthalten '''
, werden nicht unterstützt.
// 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}'''
Zeichenfolgenbezogene Operatoren
- Siehe Vergleichsoperatoren.
Zeichenfolgenbezogene Funktionen
Union-Datentypen
In Bicep ermöglicht ein Union-Typ die Erstellung eines kombinierten Typs, der aus einer Gruppe von Untertypen besteht. Eine Zuordnung ist gültig, wenn eine der einzelnen Untertypzuweisungen zulässig ist. Das |
Zeichen trennt einzelne Untertypen, die eine or
Bedingung verwenden. Die Syntax a | b
bedeutet beispielsweise, dass eine gültige Zuordnung entweder a
oder b
. Union-Typen werden in Bicep in die Einschränkung für zulässige Werte übersetzt, sodass nur Literale als Elemente zulässig sind. Unions können eine beliebige Anzahl von Literalausdrücken enthalten.
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)[]
Typgewerkschaften müssen auf einen einzelnen Azure Resource Manager-Typ wie string
, , int
oder bool
. Andernfalls erhalten Sie den BCP294-Fehlercode . Zum Beispiel:
type foo = 'a' | 1
Sie können einen beliebigen Typausdruck als Untertyp in einer Union-Typdeklaration (zwischen |
Zeichen) verwenden. Die folgenden Beispiele sind beispielsweise gültig:
type foo = 1 | 2
type bar = foo | 3
type baz = bar | (4 | 5) | 6
Benutzerdefinierter Union-Datentyp
Bicep unterstützt einen benutzerdefinierten Union-Datentyp, der verwendet wird, um einen Wert darzustellen, der einen von mehreren Typen sein kann. Um einen benutzerdefinierten Union-Datentyp zu deklarieren, können Sie einen @discriminator()
Dekorateur verwenden. Um dieses Decorator-Element nutzen zu können, ist Bicep CLI Version 0.21.X oder höher erforderlich. Die Syntax lautet:
@discriminator('<property-name>')
Das Decorator-Element für den Diskriminator akzeptiert einen einzelnen Parameter, der einen freigegebenen Eigenschaftsnamen zwischen allen Union-Membern darstellt. Dieser Eigenschaftsname muss ein erforderliches Zeichenfolgenliteral für alle Member sein und die Groß-/Kleinschreibung wird beachtet. Die Werte der unterscheidenden Eigenschaft für die Union-Member müssen eindeutig sein, wobei die Groß-/Kleinschreibung nicht beachtet werden muss.
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 }
Der Parameterwert wird basierend auf dem unterscheidenden Eigenschaftswert überprüft. Wenn der serviceConfig
Parameter beispielsweise vom Typ foo
ist, wird er mithilfe des FooConfig
Typs überprüft. Wenn der Parameter vom Typ bar
ist, wird er auch mithilfe des BarConfig
Typs überprüft. Dieses Muster gilt auch für andere Typen.
Der Union-Typ hat einige Einschränkungen:
Union-Typen müssen auf einen einzelnen Azure Resource Manager-Typ zurückgeführt werden. Die folgende Definition ist ungültig:
type foo = 'a' | 1
Nur Literale sind als Member zulässig.
Alle Literale müssen denselben primitiven Datentyp aufweisen (z. B. alle Zeichenfolgen oder alle ganzen Zahlen).
Sie können die Union-Typsyntax in benutzerdefinierten Datentypen verwenden.
Sichere Zeichenfolgen und Objekte
Die sichere Zeichenfolge verwendet das gleiche Format wie die Zeichenfolge, und das sichere Objekt verwendet das gleiche Format wie das Objekt. Mit Bicep fügen Sie den @secure()
Dekorateur zu einer Zeichenfolge oder einem Objekt hinzu.
Wenn Sie einen Parameter auf eine sichere Zeichenfolge oder ein sicheres Objekt festlegen, wird der Wert des-Parameters weder im Bereitstellungsverlauf gespeichert noch protokolliert. Wenn Sie diesen sicheren Wert auf eine Eigenschaft festlegen, die keinen sicheren Wert erwartet, ist der Wert nicht geschützt. Wenn Sie z. B. eine sichere Zeichenfolge auf ein Tag festlegen, wird dieser Wert als reiner Text gespeichert. Verwenden Sie sichere Zeichenfolgen für Kennwörter und Geheimnisse.
Das folgende Beispiel zeigt zwei sichere Parameter:
@secure()
param password string
@secure()
param configValues object
Zuweisbarkeit von Datentypen
In Bicep können Sie einem anderen Typ (Zieltyp) einen Wert (Quelltyp) zuweisen. In der folgenden Tabelle wird gezeigt, welcher Quelltyp (horizontal aufgelistet) Sie dem Zieltyp (vertikal aufgelistet) zuweisen oder nicht zuweisen können. In der Tabelle bedeutet X zuzuweisen, ein leerer Leerraum bedeutet nicht zuzuweisen, und ? bedeutet nur, wenn die Typen kompatibel sind.
Typen | any |
error |
string |
number |
int |
bool |
null |
object |
array |
Benannte Ressource | Benanntes Modul | 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 |
? | |||||||||||
Benannte Ressource | X | ? | ? | |||||||||
Benanntes Modul | X | ? | ? |
Zugehöriger Inhalt
Informationen zur Struktur und Syntax von Bicep finden Sie unter Bicep-Dateistruktur.