This is part of an ongoing series of posts documenting the built-in interpolation functions in Terraform. For more information, check out the beginning post. In this post I am going to cover the basename() function. The example file is on GitHub here.
Function name: basename(string) Returns: The basename function returns the last portion of a file path. Example:
variable "basic_path" {
default = "/usr/bin"
}
# Returns bin
output "basic_path" {
value = "${basename(var.basic_path)}"
}
##############################################
# Function: basename
##############################################
##############################################
# Variables
##############################################
variable "basename" {}
##############################################
# Resources
##############################################
##############################################
# Outputs
##############################################
output "basename_output" {
value = "${basename(var.basename)}"
}
Run the following from the basename folder to get example output for a number of different cases:
terraform apply -var 'basename=C:\\'
terraform apply -var 'basename=C:\\level0\\level1\\level2'
terraform apply -var 'basename=C:\\level0\\level1\\level2\\'
terraform apply -var 'basename=C:\\level0\\level1\\level2\\file1.txt'
terraform apply -var 'basename=/'
terraform apply -var 'basename=/level0/level1/level2'
terraform apply -var 'basename=/level0/level1/level2/'
terraform apply -var 'basename=/level0/level1/level2/file1.txt'
terraform apply -var 'basename='
If you really need to extract a file name from a long path, or just the directory name at the end of the path, this is really helpful.
From my testing I determined a few things. You need to double escape any backslash characters for Windows files since ‘\’ is the escape character that Terraform uses for adding newlines and other special characters to a string. The function will return the last file name or folder name on either Linux or Windows file system paths. If the path is just the root of the file system then you’ll get back the root ‘/’. If you leave a trailing slash on the value, such as /level0/level1/ it will be ignored and level1 will be returned. I did try a 256 character directory with a 256 character filename to see if basename would choke, but it just shrugged like Whatevs. I also tried an empty string which surprisingly gave me a ‘.’ as output. Which I guess makes sense since the ‘.’ refers to the current directory.
Coming up next is base64decode().
October 18, 2024
What's New in the AzureRM Provider Version 4?
August 27, 2024
Debugging the AzureRM Provider with VSCode
August 20, 2024
State Encryption with OpenTofu
August 1, 2024