2017-02-10 62 views
1

我不能有书面的期望循环的变量:期待循环不打印变量

#!/bin/bash 

expect -c " 
set var1 10 
puts {$var1} 
puts $expect_out({$var1}) 

foreach name { bob jim jacobo henric } { 
    puts {hello $name $var1} 
}" 

我的输出是:

# ./test 
({}) 
hello 
hello 
hello 
hello 

所以基本上它没有展开任何变量。 有什么想法?

回答

1

您应该引用'而不是"!这应该完成这项工作:

#!/bin/bash 

expect -c ' 
    set var1 10 
    puts "$var1" 

    send_user "Confirm? (Y/n): " 
    expect_user -re "(.*)\n" 
    set var1 $expect_out(1,string) 

    foreach name { bob jim jacobo henric } { 
     puts "hello $name $var1" 
    } 
' 

输出:

10 
Confirm? (Y/n): Y 
hello bob Y 
hello jim Y 
hello jacobo Y 
hello henric Y 
0

非常感谢,它的工作作为一个魅力。 但它也有一些问题,当数组元素是通过参数传递这样的:

function a { 
names=$1 
expect -c ' 
foreach name { $names } { 
     puts "$name" 
    } 
' 
} 

它只是打印:

$names 
+0

您正在进入一个文件中混合不同的编程语言的“引用地狱”。您希望暂时取消期望代码的单引号,让shell展开变量,然后用单引号恢复期望代码:'foreach name {'“$ names''} { –

0

你的意思是,任何变量必须用单引号和双引号来环绕?

' "$variable" ' 
0

好,我决定把在一个单独的脚本test.ex的预期代码:

set interfaces [lindex $argv 0] 
foreach int { $var} { 
puts $int 
} 

当我打电话希望它不循环中的字符串元素:

test.ex "string1 string2" 

,因为它只是打印:

$var 

它只是忽略变量内容,它将变量作为字符串本身处理而不扩展它,有没有办法让它工作?

0

我想通了! 只需要删除大括号{}周围的变量需要被环绕在:

set interfaces [lindex $argv 0] 
foreach int $var { 
puts $int 
}