在使用Shell写程序时,有时不得不面对交互的问题——可惜shell往往无法自动完成交互。如果交互的内容很多,自然是直接应用Expect脚本比较方便;如果交互的内容很少,而且考虑到Shell的易用性,在Shell脚本中创建一个Expect 的Here Document更加方便灵活。
如下例所示,Expect Here Document可以直接运行并将运行结果赋给KSH变量rcs_stat。
#!/bin/ksh autoload formatAPnum # Set the lab name, COOLLAB . $COOLXDIR/.netlabs # Get the RCS cell list set -A RCSs typeset -i nx=0 cat $COOLXDIR/.coolcell2dcs | while read cell do if [[ "$cell" = c* ]] then rcs=${cell%%$COOLLAB*} RCSs[$nx]=${rcs#c} nx=$nx+1 fi done # Check RCS status typeset -i loopCount=0 rcs_cnt=${#RCSs[*]} B_server=$(formatAPnum $BserverAP) while [ "${#RCSs[*]}" != 0 -a $loopCount -lt 720 ] # wait at most 2 hours do loopCount=${loopCount}+1 nx=0 while [ $nx -lt $rcs_cnt ] do rcs_stat="OOS" rcs_stat=$( expect - <<! log_user 0 set timeout 20 spawn $COOL_RSH ap$B_server TICLI send "op:cell ${RCSs[$nx]}r" expect { timeout {puts "OOSn"} "*DL(S) DOWN" {puts "OOSn"} "*DL(S) UP" {puts "UPn"} } ! ) if [ "$rcs_stat" = "UP" ] then coolprint - "RCS cell ${RCSs[$nx]} is up." unset RCSs[$nx] fi nx=${nx}+1 done [ -n "${RCSs[*]}" ] && sleep 10 done coolprint - "All RCSs are up." exit 0