无法在bash shell

时间:2015-05-01 12:29:29

标签: bash tcl expect

我一直在Windows上使用tcl shell但是在bash上协助某人发现了一个奇怪的问题:

export SERVER_HOSTNAME=server1
export USERNAME=root
export PASSWORD=pswd
export LOG_FILE="a.log"
export LOG_PATH="$env(LOG_PATH)"
export log_search_pattern="Filterable_data"


/usr/bin/expect<<EOF
set lineNum {}
set SERVER_HOSTNAME "$env(SERVER_HOSTNAME)" 
set USERNAME "$env(USERNAME)" 
set PASSWORD "$env(PASSWORD)" 
set LOG_FILE "$env(LOG_FILE)"   
set log_search_pattern "$env(log_search_pattern)"
set timeout -1  
spawn ssh "$USERNAME@$SERVER_HOSTNAME"

expect  "assword:"  
puts "$expect_out(buffer)"  
parray expect_out
send  "$PASSWORD\r" 
expect "#"
puts "$expect_out(buffer)"
send  "grep -n $log_search_pattern  $LOG_PATH/$LOG_FILE|tail -1\r"  
expect eof
EOF 

现在的问题是以下命令:

puts "$expect_out(buffer)"
prints -> (buffer)

但打印整个缓冲区内容

parray expect_out

我也尝试添加以下几行:

set a(1) val1
set a(2) val2
puts $a(1)
puts $a(2)
parray a

打印出来:

(1)
(2)
a(1) = val1
a(2) = val2

我尝试了各种组合来获得put $ a(1)来打印val1,但它总是打印(1)。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

变量在HEREDOC中扩展。如果你想避免这种情况,你需要引用部分或全部开场HEREDOC标记(即<<'EOF')(但不是结束标记)。

来自bash参考手册中的Here Documents

  

here-documents的格式为:

<<[-]word
        here-document
delimiter
     

如果引用 word 中的任何字符,分隔符上的引号删除结果,以及此处的行 - 文件没有扩展。

所以当你有:

puts "$expect_out(buffer)"
<{1>}中的

并期望HEREDOC看到它实际看到的文字字符串:

put(缓冲区)

因为shell删除了引号并为您扩展了expect变量。