Freigeben über


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

Boolesche Werte

Wenn Sie boolesche Werte angeben, verwenden true oder false. Umschließen Sie den Wert nicht mit Anführungszeichen.

param exampleBool bool = true

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.

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
  • 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.

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 redColornur 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}'''

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, , intoder 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 fooist, wird er mithilfe des FooConfig Typs überprüft. Wenn der Parameter vom Typ barist, 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 ? ?

Informationen zur Struktur und Syntax von Bicep finden Sie unter Bicep-Dateistruktur.