---
title: Expression evaluation in Bake
linkTitle: Expressions
weight: 50
description: Learn about advanced Bake features, like user-defined functions
keywords: build, buildx, bake, buildkit, hcl, expressions, evaluation, math, arithmetic, conditionals
aliases:
- /build/bake/advanced/
---
Bake files in the HCL format support expression evaluation, which lets you
perform arithmetic operations, conditionally set values, and more.
## Arithmetic operations
You can perform arithmetic operations in expressions. The following example
shows how to multiply two numbers.
```hcl {title=docker-bake.hcl}
sum = 7*6
target "default" {
args = {
answer = sum
}
}
```
Printing the Bake file with the `--print` flag shows the evaluated value for
the `answer` build argument.
```console
$ docker buildx bake --print
```
```json
{
"target": {
"default": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"answer": "42"
}
}
}
}
```
## Ternary operators
You can use ternary operators to conditionally register a value.
The following example adds a tag only when a variable is not empty, using the
built-in `notequal` [function](./funcs.md).
```hcl {title=docker-bake.hcl}
variable "TAG" {}
target "default" {
context="."
dockerfile="Dockerfile"
tags = [
"my-image:latest",
notequal("",TAG) ? "my-image:${TAG}": ""
]
}
```
In this case, `TAG` is an empty string, so the resulting build configuration
only contains the hard-coded `my-image:latest` tag.
```console
$ docker buildx bake --print
```
```json
{
"target": {
"default": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": ["my-image:latest"]
}
}
}
```
## Expressions with variables
You can use expressions with [variables](./variables.md) to conditionally set
values, or to perform arithmetic operations.
The following example uses expressions to set values based on the value of
variables. The `v1` build argument is set to "higher" if the variable `FOO` is
greater than 5, otherwise it is set to "lower". The `v2` build argument is set
to "yes" if the `IS_FOO` variable is true, otherwise it is set to "no".
```hcl {title=docker-bake.hcl}
variable "FOO" {
default = 3
}
variable "IS_FOO" {
default = true
}
target "app" {
args = {
v1 = FOO > 5 ? "higher" : "lower"
v2 = IS_FOO ? "yes" : "no"
}
}
```
Printing the Bake file with the `--print` flag shows the evaluated values for
the `v1` and `v2` build arguments.
```console
$ docker buildx bake --print app
```
```json
{
"group": {
"default": {
"targets": ["app"]
}
},
"target": {
"app": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"v1": "lower",
"v2": "yes"
}
}
}
}
```