我正在尝试编写一个bash脚本,我可以使用scp
将当前目录中的所有文件(或我指定的文件)上传到服务器。以下命令适用于bash脚本。
scp * username2@destination_host:directory2/filename2
但是,我试图允许我的脚本命名文件(最终是几个文件)或上传我服务器中的所有文件,服务器和目录。输入*
作为第一个参数时,为什么以下脚本不起作用?
scp $1 $2:$3
当尝试使用当前目录中的*
上传C ++项目时,它告诉我:
ssh:无法解析主机名main.cpp:名称或服务未知
如果我只是指定文件main.cpp它可以正常工作,但对于这种情况,我不想指定每个文件的名称,因为这可能需要一段时间才能完成更大的项目。
另外,请注意,我怎么能允许这样的脚本能够指定可变数量的文件,并且仍然能够识别我的服务器名称(例如,上传2个文件或5个我指定的文件而不是使用*)?
答案 0 :(得分:2)
当您使用*
作为脚本的参数时,shell会扩展通配符。所以如果你这样做:
scriptname * user@host directory
它变成了
scriptname file1 file2 file3 file4 user@host directory
然后脚本尝试执行:
scp file1 file2:file3
如果您希望将通配符字面地发送到脚本,则需要引用它:
scriptname "*" user@host directory
当脚本使用变量$1
时,通配符将被展开,因为您没有引用它。您应引用所有其他变量,因为您不希望它们进一步扩展:
scp $1 "$2:$3"
另一种选择是更改脚本,以便首先放置固定参数:
scriptname user@host directory filenames
然后脚本可以删除那些固定的参数,并使用"$@"
来完成剩下的工作:
dest=$1
dir=$2
shift 2
scp "$@" "$dest:$dir"