我正在尝试编写一个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"