如何在bash脚本中scp所有文件(或选择文件)



我正在尝试编写一个bash脚本,可以在其中使用scp将所有文件(或我命名的所有文件(上传到服务器中。以下命令在bash脚本中起作用。

scp * username2@destination_host:directory2/filename2

但是,我试图允许我的脚本命名文件(最终是几个文件(或上传所有文件,服务器和服务器中的目录。为什么将*作为第一个参数时,以下脚本不起作用?

scp $1 $2:$3

尝试通过在当前目录中使用*上传C 项目时,它告诉我:

ssh:无法解析hostname main.cpp:名称或服务未知

如果我只是指定文件main.cpp,则可以正常工作,但是对于这样的情况,我不想指定每个文件的名称,因为这可能需要一段时间才能用于较大的项目。

另外,一个旁注,我如何允许这样的脚本能够指定可变数量的文件并仍然能够识别我的服务器名称(例如,上传我指定的2个文件或5个文件而不是使用 *(?

当使用 *作为脚本的参数时,壳会扩展通配符。因此,如果您这样做:

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"

相关内容

  • 没有找到相关文章

最新更新