2017-02-10 118 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 
}