期望循环不打印变量

时间:2017-02-10 09:54:00

标签: bash expect

我无法在期望循环中编写变量:

#!/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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

非常感谢,它充当了魅力。 但是当数组元素通过如下参数传递时会出现一些问题:

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

它只是打印:

 $names

答案 2 :(得分:0)

你的意思是任何变量必须用单引号和双引号括起来吗?

 ' "$variable" ' 

答案 3 :(得分:0)

好吧我决定把期望代码放在一个单独的脚本test.ex中:

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

当我调用期望时,它不会循环遍历字符串元素:

test.ex "string1 string2"

因为它只是打印:

$var

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

答案 4 :(得分:0)

我明白了! 只需要删除需要循环的变量周围的大括号{}:

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