2016-05-20 35 views
0

使用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(通过googling发现),它将大括号内的字符串参数括起来。为什么它会以这种方式修改我的参数,以及如何修复它,以便$COMMAND包含我所期望的命令?

回答

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" 
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\ 
相关问题