0

in a bash script i try to do:

ssh -n $username@server2 "rm ${delete_file}"

but always get the error:

rm: missing operand

when I

> echo $delete_file
> /var/www/site/myfile.txt

I get the correct path.

What am i doing wrong?

Gooze
  • 73
  • 1
  • 10

1 Answers1

1

Could it be that in your case, $delete_file is set on the remote host and not on your current machine? If you want $delete_file to be expanded on the remote side (i.e., after ssh'ing into server2), you have to use single quotes:

ssh -n $username@server2 'rm ${delete_file}'

Other than that, do you set the value of delete_file in the same script (before ssh'ing), or before invoking your script? If latter is the case, it can't work: Variables are not propagated to scripts called by the current script/session. You could do the following about it:

delete_file=<your-value> ./ssh-script

or:

delete_file=<your-value>
export delete_file
./ssh-script

As it turns out this last option was the problem, let me elaborate on best practices: Better than setting environment variables would be the usage of positional parameters.

#!/bin/bash
# $1: file to delete
delete_file=${1:?Missing parameter: which file for deletion?}
ssh -n $username@server2 "rm ${delete_file}"

Usage of the script is now as simple as:

./ssh-script <your-file-for-deletion>

This way, you don't have to remember which variable is exactly expected by the script when calling it - simply call the script with a positional parameter.

As a bonus, the example uses parameter expansion to check for not-set or empty parameters:

delete_file=${1:?Missing parameter: which file for deletion?}

Whenever $1 happens to be unset or empty, the scripts exits immediately with exit code 1 and prints given message to stderr.

hnicke
  • 602
  • 4
  • 7