在bash脚本中,我尝试执行以下操作:
ssh -n $username@server2 "rm ${delete_file}"
但总是会收到错误:
rm: missing operand
当我
> echo $delete_file
> /var/www/site/myfile.txt
我得到正确的路径。
我在做什么错?
答案 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
。