我一直在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)。
这样做的正确方法是什么?
答案 0 :(得分:2)
变量在HEREDOC
中扩展。如果你想避免这种情况,你需要引用部分或全部开场HEREDOC
标记(即<<'EOF'
)(但不是结束标记)。
来自bash参考手册中的Here Documents:
here-documents的格式为:
<<[-]word here-document delimiter
如果引用 word 中的任何字符,分隔符是字上的引号删除结果,以及此处的行 - 文件没有扩展。
所以当你有:
puts "$expect_out(buffer)"
<{1>}中的并期望HEREDOC
看到它实际看到的文字字符串:
put(缓冲区)
因为shell删除了引号并为您扩展了expect
变量。