جایگزین ساده Expect

این یک جایگزین ساده برای expect است. تعدادی از افراد از من پرسیده‌اند، این چطور تکمیل شده است، و ازنمونه‌ای که در نکته‌ها و اشاره‌ها نشان دادم که ازنرم‌افزار مرورگر سان میکرو سیستم استفاده شده است، ملهم گردیده ، در این‌جا expect یک نمونه بسیار ساده ازآن وجود دارد.

ترکیب دستوری ‎ expect.txt ‎ خیلی ساده است:

دستور S
E[delay] expected_text
بنا براین یک دستور با ‎ "S" ‎ ( برای ارسال ) نشانه‌گذاری می‌شود، و نتیجه مورد انتظار با ‎ "E" ‎ علامت‌گذاری می‌گردد. نظر به این‌که‌، برخی دستورات برای تکمیل،میتوانند زمان بگیرند، امکان تعیین یک زمان تأخیر قبل از برآورد نتیجه مورد انتظار، وجود دارد : ‎ "E10 $"‎ قبل از expect نمودن علامت دلار،به مدت ۱۰ ثانیه تأخیر می‌کند.
اگر متن مورد انتظار پیدا نشود، اسکریپت یک ثانیه صبر می‌کند و دوباره امتحان می‌کند، و بعد دو ثانیه صبر می‌کند، بعد ۳ ثانیه، تا این‌که یا متن مورد انتظار پیدا شود، یا به یک حداکثر - که با متغیر MAX_WAITS تعیین می‌شود - برسد. تأخیر اختیاری است، بنابراین ‎ "E $"‎ فوراً یک اعلان نمایش می‌دهد.

توجه نمایید، اگر‎ MAX_WAITS=5‎، حد اکثر تأخیر پنج ثانیه نخواهد بود، بلکه ‎ 1+2+3+4+5=15 ‎ ثانیه می‌شود.

#!/bin/sh
# expect.sh | telnet > file1 
host=127.0.0.1
port=23
file=file1
MAX_WAITS=5

echo open ${host} ${port}

while read l
do
  c=`echo ${l}|cut -c1`
  if [ "${c}" == "E" ]; then
    expected=`echo ${l}|cut -d" " -f2-`
    delay=`echo ${l}|cut -d" " -f1|cut -c2-`
    if [ -z "${delay}" ]; then
      sleep ${delay}
    fi
    res=1
    i=0
    while [ "${res}" -ne "0" ]
    do
      tail -1 "${file}" 2>/dev/null | grep "${expected}" > /dev/null
      res=$?
      sleep $i
      i=`expr $i + 1`
      if [ "${i}" -gt "${MAX_WAITS}" ]; then
	echo "ERROR : Waiting for ${expected}" >> ${file}
	exit 1
      fi
    done
  else 
    echo ${l} |cut -d" " -f2-
  fi
done < expect.txt
این اسکریپت به این شکل اجرا می‌شود:
$ expect.sh | telnet > file1
این یک فایل ایجاد می‌کند، file1 را، که شامل یک رونوشت از جلسه کاری است. در این حالت، که پردازش لاگین خواهد بود یک ls از ‎/tmp‎، و خروجی cal. به عنوان مثال:
telnet> Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

declan login: steve
Password: 
Last login: Thu May 30 23:52:50 +0100 2002 on pts/3 from localhost.
No mail.
steve:~$ ls /tmp
API.txt		      cgihtml-1.69.tar.gz      orbit-root
cal
a.txt		      cmd.txt		       orbit-steve
apache_1.3.23.tar.gz  defaults.cgi	       parser.c
b.txt		      diary.c		       patchdiag.xref
background.jpg	      drops.jpg		       sh-thd-1013541438
blocks.jpg	      fortune-mod-9708.tar.gz  stone-dark.jpg
blue3.jpg	      grey2.jpg		       water.jpg
c.txt		      jpsock.131.1249
steve:~$ cal
      May 2002
Su Mo Tu We Th Fr Sa 
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

steve:~$ exit
logout
Steve Parker  نوشته  Bourne و Bash راهنمای آموزشی اسکریپت نویسی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید