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.

LukeR
  • 3,126
  • 2
  • 30
  • 25

3 Answers3

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.

Torian
  • 2,364
  • 18
  • 10
  • I ended up accepting this answer as I found it more complete. I also find the braces to be more readable. Thanks. – LukeR Sep 08 '11 at 05: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
tylerl
  • 15,055
  • 7
  • 51
  • 72
  • Also works within quotes: `FILENAME="${DB}_$(date +%s)"` if you want to embed stars or spaces or something. – tylerl Sep 08 '11 at 04: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
quanta
  • 51,413
  • 19
  • 159
  • 217
  • Legend. It won't let me accept this for 9 minutes, but you have made me a momentarily happy man. Cheers. – LukeR Sep 08 '11 at 04:05