Bash or zsh conditional patterns and variable expansions

Suppose I want to generate a filename based on some given variables.

track=01
title="Some title"
album="Some album"
echo ${track}. ${title} (${album})

-> 01. Some title (Some album)

Now in the case $album is empty I would get

->01. Some title ()

I would rather want in that case the parenthesis to be removed:

->01. Some title

What I want is something similar to the templates used in foobar like this:

%track%. %title% [(%album%)]

Is it possible to do it in bash (or zsh) but in a single expression like the above and not using if...fi nor nothing like that.

1 Answer

bash: yes, but it's not very pretty:

filename="${track}. ${title}${album:+ ($album)}"

The ${var:+value} expands to "value" if $var is both set and non-empty.

Demonstrating:

$ album="Some album"
$ filename="${track}. ${title}${album:+ ($album)}"
$ declare -p filename
declare -- filename="01. Some title (Some album)"
$ album=""
$ filename="${track}. ${title}${album:+ ($album)}"
$ declare -p filename
declare -- filename="01. Some title"
$ unset album
$ filename="${track}. ${title}${album:+ ($album)}"
$ declare -p filename
declare -- filename="01. Some title"

ref: 3.5.3 Shell Parameter Expansion

2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like