无法在expect中的一个变量中接受多个命令行参数

时间:2016-05-20 17:14:39

标签: scripting expect

使用cygwin 32bit,期待v5.45(最新的cygwin附带的内容,似乎)。

COMMAND="$WIN_BUILD_ROOT\\scripts\\signBinaries.bat $BUS $NET_DRIVE $WIN_SIGNING_ROOT"
$CLIENT_BUILD_ROOT/scripts/runCommand.sh $arg1 $arg2 $arg3 $arg4 $COMMAND

runCommand.sh:

#!C:\cygwin\bin\expect.exe -f
set timeout 9

set arg1 [lindex $argv 0]
set arg2 [lindex $argv 1]
set arg3 [lindex $argv 2]
set arg4 [lindex $argv 3]
set COMMAND [lrange $argv 4 end]

send -- "$COMMAND\r"

给我:

{s:\git\builds\scripts\signBinaries.bat} 64 s {s:\git\builds\}
The filename, directory name, or volume label syntax is incorrect.

场景是,前四个参数是固定的。然后可能会有一些可变数量的命令,我希望这些命令可以作为一个命令来执行。如果我只使用[lindex argv 4],我只会获得signBinaries脚本名称,无论它是否用引号括起来。使用lrange(通过谷歌搜索找到),它将字符串参数括在大括号中,如图所示。为什么要以这种方式修改我的参数?如何修复它以便$COMMAND包含我想要的命令?

2 个答案:

答案 0 :(得分:1)

在期望扩展的Tcl中,您必须知道变量的数据类型:它是字符串还是列表?当列表被字符串化时,如果它们包含“元字符”(如反斜杠和大括号),它可以引用它的一些元素。

在大多数情况下,当您想要将列表内容用作单个字符串时,最好自己进行字符串化:

set COMMAND [list "s:\\git\\builds\\scripts\\signBinaries.bat" 64 s "s:\\git\\builds\\"]

puts $COMMAND
# => {s:\git\builds\scripts\signBinaries.bat} 64 s s:\\git\\builds\\

puts [join $COMMAND " "]
# => s:\git\builds\scripts\signBinaries.bat 64 s s:\git\builds\

答案 1 :(得分:0)

啊哈!想出来了:

set COMMAND [join [lrange $argv 4 end]]

给我:

s:\git\builds\scripts\signBinaries.bat 64 s s:\git\builds
"BUS: 64"
"DRIVE: s"
"WORKSPACE: s:\git\builds"