views:

678

answers:

4

I'm trying to write a Bash script that will SSH into a machine and create a directory. The long-term goal is a bit more complicated, but for now I'm starting simple. However, as simple as it is, I can't quite seem to get it. Here's my code:

#!/bin/bash
ssh -T [email protected] <<EOI

# Fix "TERM environment variable undefined" error.
TERM=dumb
export TERM

# Store todays date.
NOW=$(date +"%F")
echo $NOW

# Store backup path.
BACKUP="/backup/$NOW"
[ ! -d $BACKUP ] && mkdir -p ${BACKUP}
echo $BACKUP

exit
EOI

It runs without any explicit errors. However, the echoed $NOW and $BACKUP variables appear empty, and the /backup directory is not created. How do I fix this?

A: 

Try:

NOW=`date +"%F"`
Pablo Santa Cruz
The $() notation should work in newer bash versions. It tested fine on my RHEL 4 system with bash release 3.00.15(1).
GreenMatt
`$()` is the same as `` except the former easily allows nesting. This is something any POSIX-compliant sh can handle.
jamessan
+3  A: 

Your script is doing substitution on the local host before being sent over.

Change your first line to:

ssh -T [email protected] <<'EOI'

This will cause the raw script to get sent over and interpreted on your remote host.

If you wanted a mix (so for example, if you wanted the date command executed on your local host, you should leave ssh line unchanged and quote the individual command):

ssh -T [email protected] <<EOI

# Execute the date command on the local machine.  The assignment still
# happens on the remote machine
NOW=$(date +"%F")

# Quote your $ so that the replacement happens on the remote machine
echo \$NOW
R Samuel Klatchko
Your second example quotes the here-doc delimiter and the variable. I think you intended to only escape the variable. Otherwise +1
Dennis Williamson
@DennisWilliamson - good catch. I've corrected my example.
R Samuel Klatchko
+4  A: 

The shell on the local host is doing variable substitution on $NOW and $BACKUP because the "EOI" isn't escaped. Replace the ssh [email protected] <<EOI with ssh [email protected] <<\EOI.

Steve Emmerson
Thanks. This required the fewest changes, and works perfectly.
Chris S
+2  A: 

The variables are being evaluated in the script on the local machine. You need to subsitute the dollar signs with escaped dollar signs.

#!/bin/bash
ssh -T [email protected] <<EOI

# Fix "TERM environment variable undefined" error.
TERM=dumb
export TERM

# Store todays date.
NOW=\$(date +"%F")
echo \$NOW

# Store backup path.
BACKUP="/backup/\$NOW"
[ ! -d \$BACKUP ] && mkdir -p \${BACKUP}
echo \$BACKUP

exit
EOI
hbar