Tipi di dati in Bicep
Questo articolo descrive i tipi di dati supportati in Bicep. Per definire tipi di dati personalizzati, vedere Tipi di dati definiti dall'utente.
Matrici
Le matrici iniziano con una parentesi quadra sinistra ([
) e terminano con una parentesi quadra destra (]
). In Bicep è possibile dichiarare una matrice in una singola riga o in più righe. Le virgole (,
) vengono usate tra i valori nelle dichiarazioni a riga singola, ma non vengono usate nelle dichiarazioni a più righe. È possibile combinare e associare dichiarazioni a riga singola e a più righe. La dichiarazione a più righe richiede l'interfaccia della riga di comando di Bicep versione 0.7.X o successiva.
var multiLineArray = [
'abc'
'def'
'ghi'
]
var singleLineArray = ['abc', 'def', 'ghi']
var mixedArray = ['abc', 'def'
'ghi']
Ogni elemento della matrice può essere di qualsiasi tipo. È possibile avere una matrice in cui ogni elemento è lo stesso tipo di dati o una matrice che contiene tipi di dati diversi.
Nell'esempio seguente viene illustrata una matrice di numeri interi e una matrice di tipi diversi.
var integerArray = [
1
2
3
]
var mixedArray = [
resourceGroup().name
1
true
'example string'
]
Le matrici in Bicep sono basate su zero. Nell'esempio seguente, l'espressione exampleArray[0]
restituisce 1 e exampleArray[2]
restituisce 3. L'indice dell'indicizzatore potrebbe essere un'altra espressione. L'espressione exampleArray[index]
restituisce 2. Gli indicizzatori integer sono consentiti solo nell'espressione dei tipi di matrice.
var index = 1
var exampleArray = [
1
2
3
]
Quando l'indice è fuori dai propri limiti, viene visualizzato l'errore seguente:
The language expression property array index 'x' is out of bounds
Per evitare questa eccezione, usare l'operatore logico Or, come illustrato nell'esempio seguente:
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
Operatori correlati alla matrice
- Usare gli operatori di confronto per confrontare due matrici.
- Usare la funzione di accesso Index per ottenere un elemento da una matrice.
- Usare l'operatore Safe-dereference per accedere agli elementi di una matrice.
- Usare Spread per unire matrici.
Funzioni correlate alla matrice
Valori booleani
Quando si specificano valori booleani, usare true
o false
. Non racchiudere il valore tra virgolette.
param exampleBool bool = true
Operatori relativi a valori booleani
- Usare gli operatori di confronto per confrontare i valori booleani.
- Vedere Operatori logici.
Funzioni correlate a valori booleani
Vedere Funzione logica
Integer
Quando si specificano valori interi, non usare le virgolette.
param exampleInt int = 1
Gli interi bicep sono interi a 64 bit. Quando vengono passati come parametri inline, l'SDK o lo strumento da riga di comando usato per la distribuzione può limitare l'intervallo di valori. Ad esempio, quando si usa PowerShell per distribuire Bicep, i tipi integer possono variare da -2147483648 a 2147483647. Per evitare questa limitazione, specificare valori integer di grandi dimensioni in un file di parametri. I tipi di risorse applicano i propri limiti per le proprietà dei numeri interi.
Bicep supporta un tipo letterale integer che fa riferimento a un valore specifico che è un numero intero esatto. Nell'esempio seguente, 1
è un tipo letterale integer e foo
può essere assegnato solo il valore 1
e nessun altro valore.
output foo 1 = 1
È possibile dichiarare un tipo letterale integer inline, come illustrato nell'esempio precedente o in un'istruzione type
.
type oneType = 1
output foo oneType = 1
output bar oneType = 2
Nell'esempio precedente, l'assegnazione 2
a restituisce un errore BCP033: "Previsto un valore di tipo ma il valore fornito è di tipo 1
2
".bar
Nell'esempio seguente viene usato un tipo letterale integer con un tipo di unione:
output bar 1 | 2 | 3 = 3
I formati a virgola mobile, decimale o binaria non sono attualmente supportati.
Operatori correlati a numeri interi
Funzioni correlate a numeri interi
Vedere Funzioni numeriche.
Oggetti
Gli oggetti iniziano con una parentesi graffa sinistra ({
) e terminano con una parentesi graffa destra (}
). In Bicep è possibile dichiarare un oggetto in una singola riga o in più righe. Ogni proprietà in un oggetto è costituita da una chiave e da un valore. La chiave e il valore sono separati dai due punti (:
). Un oggetto consente qualsiasi proprietà di qualsiasi tipo. Le virgole (,
) vengono usate tra le proprietà per le dichiarazioni a riga singola, ma non vengono usate tra le proprietà per le dichiarazioni a più righe. È possibile combinare e associare dichiarazioni a riga singola e a più righe. La dichiarazione a più righe richiede l'interfaccia della riga di comando di Bicep versione 0.7.X o successiva.
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 le virgolette sono facoltativamente consentite nelle chiavi delle proprietà dell'oggetto:
var test = {
'my - special. key': 'value'
}
Nell'esempio precedente le virgolette vengono usate quando le chiavi delle proprietà dell'oggetto contengono caratteri speciali. Ad esempio, lo spazio, -
o .
. L’esempio seguente illustra come usare l'interpolazione nelle chiavi di proprietà dell'oggetto.
var stringVar = 'example value'
var objectVar = {
'${stringVar}': 'this value'
}
Le funzioni di accesso alle proprietà vengono utilizzate per accedere alle proprietà di un oggetto. Vengono costruiti usando l'operatore .
.
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
È possibile usare funzioni di accesso alle proprietà con qualsiasi oggetto, inclusi parametri e variabili di tipi di oggetto e valori letterali oggetto. Una funzione di accesso alla proprietà utilizzata in un'espressione di un tipo non oggetto è un errore.
È anche possibile usare la sintassi []
per accedere a una proprietà. L'esempio seguente restituisce Development
.
var environmentSettings = {
dev: {
name: 'Development'
}
prod: {
name: 'Production'
}
}
output accessorResult string = environmentSettings['dev'].name
In JSON un oggetto è una raccolta non ordinata di zero o più coppie chiave o valore. L'ordinamento potrebbe essere diverso a seconda delle implementazioni. Ad esempio, la funzione Bicep items() ordina gli oggetti in ordine alfabetico. In altri luoghi, è possibile conservare l'ordinamento originale. A causa di questo non determinismo, evitare di fare ipotesi sull'ordinamento delle chiavi oggetto quando si scrive codice, che interagisce con i parametri e gli output di distribuzione.
Quando si accede a una proprietà non existing di un oggetto, viene visualizzato l'errore seguente:
The language expression property 'foo' doesn't exist
Per evitare l'eccezione, è possibile usare l'operatore logico And, come illustrato nell'esempio seguente:
param objectToTest object = {
one: 1
two: 2
three: 3
}
output bar bool = contains(objectToTest, 'four') && objectToTest.four == 4
Operatori correlati agli oggetti
- Utilizzare gli operatori di confronto per confrontare gli oggetti.
- Utilizzare la funzione di accesso Index per ottenere una proprietà da un oggetto .
- Usare l'operatore Safe-dereference per accedere ai membri dell'oggetto.
- Usare Spread per unire gli oggetti.
Funzioni correlate agli oggetti
Vedere Funzioni dell'oggetto.
Stringhe
In Bicep le stringhe sono contrassegnate con virgolette singole ed è necessario dichiararle su una singola riga. Tutti i caratteri Unicode con punti di codice compresi tra 0
e 10FFFF
sono consentiti.
param exampleString string = 'test value'
La tabella seguente elenca il set di caratteri riservati di cui è necessario eseguire l'escape usando una barra rovesciata (\
):
Sequenza di escape | Valore rappresentato | Note |
---|---|---|
\\ |
\ |
|
\' |
' |
|
\n |
Avanzamento riga | |
\r |
Ritorno a capo | |
\t |
Carattere di tabulazioni | |
\u{x} |
Punto di codice Unicode x |
Rappresenta x un valore punto di codice esadecimale tra 0 e 10FFFF (inclusi entrambi). Sono consentiti zeri iniziali. I punti di codice precedenti FFFF vengono generati come coppia di surrogati. |
\$ |
$ |
Eseguire l’escape solo se seguito da { . |
// evaluates to "what's up?"
var myVar = 'what\'s up?'
Bicep supporta un tipo letterale stringa che fa riferimento a un valore stringa specifico. Nell'esempio seguente è red
un tipo letterale stringa. È possibile assegnare il valore red
solo a redColor
.
output redColor 'red' = 'red'
È possibile dichiarare un tipo letterale stringa inline, come illustrato nell'esempio precedente o in un'istruzione type
.
type redColor = 'red'
output colorRed redColor = 'red'
output colorBlue redColor = 'blue'
Nell'esempio precedente, l'assegnazione blue
a restituisce un errore BCP033: "Previsto un valore di tipo ma il valore fornito è di tipo red
blue
".colorBlue
L'esempio seguente mostra un tipo letterale stringa usato con un tipo di unione:
type direction = 'north' | 'south' | 'east' | 'west'
output west direction = 'west'
output northWest direction = 'northwest'
Tutte le stringhe in Bicep supportano l'interpolazione. Per inserire un'espressione, racchiuderla tra ${
e }
. Le espressioni a cui viene fatto riferimento non possono estendersi su più righe.
var storageName = 'storage${uniqueString(resourceGroup().id)}'
Stringhe a più righe
In Bicep le stringhe a più righe sono definite tra tre virgolette singole ('''
) seguite facoltativamente da una nuova riga (la sequenza di apertura) e tre virgolette singole ('''
è la sequenza di chiusura). I caratteri immessi tra la sequenza di apertura e di chiusura sono letti verbatim. L'escape non è necessario o possibile.
Nota
Il parser Bicep legge tutti i caratteri così come sono. A seconda delle terminazioni di riga del file Bicep, le nuove righe vengono interpretate come \r\n
o \n
.
L'interpolazione non è attualmente supportata nelle stringhe a più righe. A causa di questa limitazione, potrebbe essere necessario usare la concat
funzione anziché usare l'interpolazione.
Le stringhe a più righe che contengono '''
non sono supportate.
// 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}'''
Operatori correlati alle stringhe
- Vedere Operatori di confronto.
Funzioni correlate alle stringhe
Tipi unione
In Bicep, un tipo di unione consente la creazione di un tipo combinato costituito da un set di sottotipi. Un'assegnazione è valida se è consentita una delle singole assegnazioni di sottotipo. Il |
carattere separa singoli sottotipi che usano una or
condizione. Ad esempio, la sintassi a | b
indica che un'assegnazione valida può essere a
o b
. I tipi di unione vengono convertiti nel vincolo allowed-value (valore consentito) in Bicep, quindi solo i valori letterali sono consentiti come membri. Le unioni possono includere un numero qualsiasi di espressioni di tipo letterale.
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)[]
Le unioni dei tipi devono essere reducibili in un singolo tipo di Azure Resource Manager, ad esempio string
, int
o bool
. In caso contrario, viene visualizzato il codice di errore BCP294 . Ad esempio:
type foo = 'a' | 1
È possibile usare qualsiasi tipo di espressione come sottotipo in una dichiarazione di tipo unione (tra |
caratteri). Ad esempio, tutti gli esempi seguenti sono validi:
type foo = 1 | 2
type bar = foo | 3
type baz = bar | (4 | 5) | 6
Tipo di dati unione con tag personalizzati
Bicep supporta un tipo di dati unione con tag personalizzato, che rappresenta un valore che può essere uno dei diversi tipi. Per dichiarare un tipo di dati unione con tag personalizzati, è possibile usare un @discriminator()
elemento Decorator. L'interfaccia della riga di comando di Bicep versione 0.21.X o successiva è necessaria per usare questo elemento Decorator. La sintassi è:
@discriminator('<property-name>')
L'elemento decorator discriminante accetta un singolo parametro, che rappresenta un nome di proprietà condiviso tra tutti i membri dell'unione. Questo nome di proprietà deve essere un valore letterale stringa obbligatorio per tutti i membri e fa distinzione tra maiuscole e minuscole. I valori della proprietà discriminata nei membri dell'unione devono essere univoci in modo che non fa distinzione tra maiuscole e minuscole.
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 }
Il valore del parametro viene convalidato in base al valore della proprietà discriminata. Ad esempio, nell'esempio precedente, se il serviceConfig
parametro è di tipo foo
, viene convalidato usando il FooConfig
tipo . Analogamente, se il parametro è di tipo bar
, viene convalidato usando il BarConfig
tipo . Questo modello si applica anche ad altri tipi.
Il tipo di unione presenta alcune limitazioni:
I tipi di unione devono essere reducibili in un singolo tipo di Azure Resource Manager. La definizione seguente non è valida:
type foo = 'a' | 1
Solo i valori letterali sono consentiti come membri.
Tutti i valori letterali devono essere dello stesso tipo di dati primitivo, ad esempio tutte le stringhe o tutti i numeri interi.
È possibile usare la sintassi del tipo di unione nei tipi di dati definiti dall'utente.
Stringhe e oggetti sicuri
Le stringhe protette usano lo stesso formato della stringa e gli oggetti sicuri usano lo stesso formato dell'oggetto. Con Bicep si aggiunge l'elemento @secure()
Decorator a una stringa o a un oggetto .
Quando si imposta un parametro su una stringa sicura o un oggetto sicuro, il valore del parametro non viene salvato nella cronologia di distribuzione o registrato. Se si imposta tale valore sicuro su una proprietà che non prevede un valore sicuro, il valore non è protetto. Ad esempio, se si imposta una stringa sicura su un tag, tale valore verrà archiviato come testo normale. Usare stringhe sicure per password e segreti.
L'esempio seguente illustra due parametri sicuri:
@secure()
param password string
@secure()
param configValues object
Assegnazione di tipi di dati
In Bicep è possibile assegnare un valore di un tipo (tipo di origine) a un altro tipo (tipo di destinazione). La tabella seguente mostra il tipo di origine (elencato orizzontalmente) che è possibile assegnare o non è possibile assegnare al tipo di destinazione (elencato verticalmente). Nella tabella X significa assegnabile, uno spazio vuoto significa non assegnabile e ? significa solo se i tipi sono compatibili.
Tipi | any |
error |
string |
number |
int |
bool |
null |
object |
array |
Risorsa denominata | Modulo denominato | 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 |
? | |||||||||||
Risorsa denominata | X | ? | ? | |||||||||
Modulo denominato | X | ? | ? |
Passaggi successivi
Per informazioni sulla struttura e la sintassi di Bicep, vedere Struttura e sintassi dei file Bicep.