我正在使用expect来模拟sftp交互式提示符(download_from_sftp.exp
):
#!/usr/bin/expect
set username [lindex $argv 0];
set server [lindex $argv 1]
set password [lindex $argv 2];
set source [lindex $argv 3];
set target [lindex $argv 4];
set timeout 2400;
spawn sftp "$username@$server"
expect "password:"
send "$password\n"
expect "sftp>"
send "get ${source} ${target}\n"
expect "sftp>"
send "bye\n"
interact
其中$targe
是包含空格的输出目录:(
如何传递参数以使其被视为一个参数? Currenly我正在使用类似的东西:
cmd="${git_directory}/sh/download_from_sftp.exp $sftp_username
$sftp_server $sftp_password ${src_xml} ${target_xml}"
$cmd # run
将扩展最后一个参数。
答案 0 :(得分:1)
在shell中,你不能"序列化"带有参数到单个字符串的命令,并使用一些空格作为常规空格反序列化命令,一些作为"特殊"空格。
你需要使用一个shell数组(bash,ksh,zsh都有数组)
\r
所有这些报价都是必需的。
这是将包含空格的参数可靠地保存为单个实体的唯一方法。
在期待中,你可能不得不引用这些论点(对于sftp')
\n
通常情况下,您使用\r
发送而不是{{1}} - {{1}}是一个回车符,或者"点击输入"
答案 1 :(得分:0)
你可以用引号括起争论:
cmd="${git_directory}/sh/download_from_sftp.exp $sftp_username $sftp_server$sftp_password \"${src_xml}\" \"${target_xml}\""
$cmd # run