2015-05-01 46 views
0

我一直在使用Windows TCL外壳,但同时在bash的协助有人发现了一个奇怪的问题:无法打印数组中的Bash shell

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 "[email protected]$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 

我尝试各种组合,以获得看跌美元(1)打印VAL1但它总是打印(1)。

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

回答

2

变量扩展为HEREDOC s。如果您想避免这种情况,您需要引用部分或全部HEREDOC标记(即<<'EOF')(但不是最后一个)。

Here Documents在Bash参考手册:

这里,文件的格式为:

<<[-]word 
     here-document 
delimiter 

如果任何字符被引用,该分隔符是结果对单词的报价删除,并且这里文档中的行不被展开。

因此,当您有:

puts "$expect_out(buffer)" 
HEREDOC

,并期望expect看到文本字符串,它实际上看到:

看跌期权(缓冲)

因为外壳已删除引用并扩展了你的变量$expect_out

+0

谢谢Etan - 但它甚至没有引号:例如'放$ a(1)'也会打印“(1)” - 以任何方式解决这个问题。 – BabyGroot

+2

我对这个评论感到困惑。围绕变量扩展的引号不是问题。 *缺乏围绕heredoc标记的引号是问题所在。整个heredoc正受到shell的各种扩展。你不希望这样引用heredoc标记......或者在heredoc中用反斜杠对每个'$','''''''等等进行转义 –

+1

@ user1570408,同样的问题也会影响你的变量'从shell传入,期望:shell没有定义'$ env'变量,所以希望你有'$ SERVER_HOSTNAME ==“(SERVER_HOSTNAME)”'等 –