通过ssh发送带有$ variable文件名的rm命令

时间:2018-07-10 07:35:12

标签: bash ssh

在bash脚本中,我尝试执行以下操作:

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

但总是会收到错误:

rm: missing operand

当我

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

我得到正确的路径。

我在做什么错?

1 个答案:

答案 0 :(得分:1)

在您的情况下,$delete_file是在远程主机上而不是在当前计算机上设置的吗? 如果您想将$delete_file扩展到远端(例如,在切入server2之后),则必须使用单引号:

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

除此之外,您是否在同一脚本中(在ssh'ing之前)或在调用脚本之前设置了delete_file的值?如果是后者,则将不起作用:变量不会传播到当前脚本/会话调用的脚本。 您可以执行以下操作:

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

或:

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

事实证明,最后一个选择就是问题所在,让我详细介绍一下最佳做法: 比设置环境变量更好的方法是使用positional parameters

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

脚本的使用现在非常简单:

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

这样,您不必在调用脚本时记住脚本确切期望的变量-只需使用位置参数调用脚本即可。

作为奖励,该示例使用参数扩展来检查未设置或为空的参数:

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

每当$1设置为空或为空时,脚本立即以exit code 1退出,并将给定的消息打印到stderr