6

I have the following excerpt from a bash script used to backup a database

#!/bin/bash
DB=database_name
DBUSER=username
FILENAME=$DB_$(date +%s).sql

I am trying to reuse the value of DB within the FILENAME variable assignment, but it won't let me use substitution this way. I just get the timestamp for the file name.

Is it possible to achieve what I want, and if so what is the syntax?

thanks.

3 Answers 3

8

The problem is that bash does not know that you mean $DB instead of $DB_ (which is a perfectly valid name for a variable).

The best option is to be explicit on the name of the variable using braces around its name:

FILENAME=${DB}_$(date %s).sql

This saves you the trouble of escaping other characters which are not to be interpreted as part of a variable name.

1
  • I ended up accepting this answer as I found it more complete. I also find the braces to be more readable. Thanks.
    – LukeR
    Sep 8, 2011 at 5:27
4

Alternately, use braces to isolate your variable. I think it's a bit clearer than putting quotes in there.

FILENAME=${DB}_$(date +%s).sql
1
  • Also works within quotes: FILENAME="${DB}_$(date +%s)" if you want to embed stars or spaces or something.
    – tylerl
    Sep 8, 2011 at 4:15
2

Enclose the underscore in double quotes (or single quotes for the stronger):

#!/bin/bash
DB=database_name
DBUSER=username
FILENAME=$DB"_"$(date +%s).sql
1
  • Legend. It won't let me accept this for 9 minutes, but you have made me a momentarily happy man. Cheers.
    – LukeR
    Sep 8, 2011 at 4:05

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .