带空格的字符串作为单个Expect脚本参数

时间:2017-07-13 22:24:13

标签: shell parameter-passing expect

我正在使用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

将扩展最后一个参数。

2 个答案:

答案 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