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