نمونه مستند سازی شده - Speedtouchconf

این اسکریپتی است که من نگهداری می‌کنم و برای پیکربندی یک مودم ‎ Alcatel SpeedTouch‎ به کار می‌رود. اگر واقعاً می‌خواهید از اسکریپت استفاده کنید به آدرس http://speedtouchconf.sourceforge.net/ بروید. این صفحه فقط در مورد مستندسازی آن ، و نشان دادن سبک‌های خوب و بد در کدنویسی است.

توجه نمایید که کد به صورت <PRE> می‌باشد، بنابراین، ممکن است لازم باشد در مرورگرتان، برای دیدن توضیحات، به نسبت کیفیت وضوح نمایشگر و اندازه‌های فونت‌ها به چپ و راست مرور کنید، . تغییر این‌ها برای کار در نمایشگرهای کوچکتر به معنی تغییر خود کد نیز می‌باشد،که مورد اشاره این تمرین نیست. اگر شما نمی‌توانید وضوح تصویر نمایشگر خود راافزایش بدهید، می‌توانید کاهش اندازه فونت monospace متن آرایش نشده را امتحان کنید.
من نباید به زور تمام این یادداشت‌ها را در داخل خود اسکریپت ضبط می‌کردم ، اسکریپتی مانند این فقط باید توسط کسی که آماده فهمیدن چگونگی کارکرد آن می‌باشد، ویرایش شود، این توضیحات برای مقاصد آموزشی است، و به قصد کمک به ویرایش این اسکریپت خاص نمی‌باشد.

کدتوضیحات
#!/bin/bash
# (c) Steve Parker, 17 Oct 2002
# steve at steve dash parker dot org
# Released under GPL version 2 (http://www.gnu.org/copyleft/gpl.html)
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of Version 2 of the the GNU General Public License 
#    as published by the Free Software Foundation. Any later versions of
#    the GPL will be evaluated as they are released, and this software may
#    or may not be re-released under those terms also.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# See the included file COPYING for more details.
# SpeedTouch Configuration for Alcatel USB Modem
The GPL license requires this boilerplate.
# Tested on RedHat 8.0 with BT OpenWorld by Steve
# Tested on Mandrake 9.0 with BT OpenWorld by Steve
# Updated 29 Oct 2002 to create a log file for diagnosis.
# Updated 21 Nov 2002 to list Singapore Pacificnet VPI/VCI pair.
# Updated 25 Nov 2002 to use "tar -xzf" not "tar xzf" as one user reported problems.
# Also added a web page (http://www.japarker.btinternet.co.uk/speedtouch/)
# Updated 03 Dec 2002 - moved to http://speedtouchconf.sourceforge.net/
# btinternet.co.uk site deprecated.
# Updated 05 Dec 2002 - creates symlink to /etc/ppp/resolv.conf to fix DNS problems.
# Also includes speedtouch-1.1.tar.bz2, accepts microcode in current directory as
# speedmgmt.tar.gz, mgmt.o, or alcaudsl.sys. Therefore no need to edit the script.
# Updated 07 Dec 2002 - fixed a bug that it couldn't find the tarball.
# Updated 17 Dec 2002 - added uname -a to logfile, added tests for gcc, make
# Updated 23 Dec 2002 - specified GPLv2 after reading http://www.infoworld.com/articles/hn/xml/02/11/06/021106hngnudelay.xml?s=IDGNS
# Version 08 Jan 2003 missing a "fi" - fixed 15/1/2003
# 16 Jan 2003 - fixed another stupid bug.
# 19 Jan 2003 - Actually did some decent testing, and got it working again. Also added a comment about the timeout messages.
# 20 Jan 2003 - Just some extra checks.
# 23 Feb 2003 - Allows for init.d being /etc/init.d/ or /etc/rc.d/init.d
# Also some basic checks for the kernel-level driver. First tidy-up of the kernel testing code, too.
# 07 Mar 2003 - Some SuSE (LSB) tidyups; skip debian-specific notes for non-debian users
# 11th August 2003 - Changed to stop if gcc/make/etc are not installed. Also bundled the 1.2beta2 driver.
# 18th August 2003 - Tidied up the output a little bit to make it clearer.
# 9th September 2003 - Fixed speedtouch-init for RedHat 9
# 11th September 2003 - Added 2.6 support; tidied up the kernel checks a bit.

همواره یک فایل تغییرات ضمیمه کنید - این کار به خودتان و همچنین هرفرد دیگری کمک خواهد نمود. اگر شخصی با یک مشکل با شما تماس بگیرد، شما می‌توانید به سادگی کنترل کنید که چه وقت اتفاق افتاده، و ببینید که نگارش جدیدترآن مشکل را برطرف می‌کند.
من همچنین در این‌جا اشاره می‌کنم که کدام توزیع ها گزارش کرده‌اند که کار کرده است - به نظر می‌رسد در اکثر توزیع ها کار می‌کند -لیندوز، دبیان، ردهت، ماندریک، سوزه، وغیره.
VERSION=11.09.2003
# Location of Log File (send me this file if you need help diagnosing problems)
LOGFILE=/tmp/speedtouch.txt
# Quiet compilation (recommended)
QUIET=YES
# Speedtouch (speedtouch.sf.net) version
SPEEDTOUCH=speedtouch-1.1

MODEM_RUN=/usr/local/sbin/modem_run
PATH=/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH
PPPD=pppd
UNAME=uname
LSPCI=lspci
# Only tested with PREFIX=/
PREFIX="/"
تنظیم برخی متغیرهای ظاهراً کم استفاده، در ابتدای اسکریپت، مفید است، این به آن معنی است که می‌توانید به سادگی چیزی را یکبار و فقط یکبار تغییر دهید. همچنین درگیری با خطاهای تایپی را آسان‌تر می‌کند - در زبان غیر ترجمه‌ای، برخی خطاها برای پیگری ، می‌توانند نیرنگ‌آمیز باشند.
همچنین توضیح هرکدام همراه با مقصود از آن.
همچنین قرار دادن مسیر تا اندازه‌ای که معقول می‌دانید نیز می‌تواند سودمند باشد - این اسکریپت انتظار دارد قادر به یافتن کد در ‎ /usr/local/sbin ‎   باشد، که اغلب به طور پیش‌فرض در PATH اکثر افراد موجود نمی‌باشد. با قرار دادن آن در آن‌جا، می‌توانیم ازبسیاری موارد کوچک نامطبوع اجتناب ورزیم.
همچنین تنظیم متغیری برای شماره نگارش، ایده خوبی است، به این طریق به سادگی می‌تواند به اسکریپت امکان گزارش شماره نگارش در موقعیت‌های مختلف، را بدهید، اما وقتی اسکریپت را به روز می‌کنید، فقط اول باید آن متغیر را تغییر بدهید. در این حالت، من از تاریخ به عنوان شماره نگارش استفاده می‌کنم، چون من دلیل تجاری برای نامیدن آن به صورت ‎ "8.0"‎ یا ‎ "2003 Professional" ‎ نداشته‌ام و من واقعاًمطمئن نیستم که ‎ "1.0" ‎ به چه معنی است. از طرف دیگر استفاده از تاریخ این‌جا در UK عبارت , ‎"11.09.2003"‎ به معنی یازدهم سپتامبر 2003است، ودر امریکا این به معنی نهم نوامبر 2003 است. من کد را در یازدهم سپتامبر 2003 تألیف کرده‌ام و امیدوارم هر کسی بداند که "Sep" یعنی نهمین ماه، می‌شود ‎, "September", "Septiembre", "Settembre", یا "Septembre"‎.
حالا تعریف توابع را شروع می‌کنیم. خیلی با ارزش است که تا آن جا که ممکن است وظایف را در توابع قراربدهیم، حتی وقتی ( مانند بیشترین این‌ها ) فقط یکبار به کار می‌روند. چند دلیل برای این موضوع وجود دارد، نه تنها کد را مرتب‌تر می‌کند، بلکه خواندن و ویرایش آن را ساده‌تر می‌سازد .
به عنوان مثال، در این اسکریپت مقداری کد برای کار با این واقعیت، که یک ارتقاء‎(1.2b)‎ درایور مرتبط با مودم جدید ‎ (model 330) ‎ وجود دارد، اما درایور 1.1 بهتر تست شده است. اگر درایور 1.2 بهبود بیابد، ممکن است احساس شود که فقط از آن استفاده شود . در این روش دانستن آن که چه قسمتی نیاز به تغییر دارد ساده‌تر است (مدیریت یک اسکریپت 681 سطری می‌توانددشوار باشد), و به این معنی است که سایر توابع واقعاً مواظبت نمی‌شوند.
check_err()
{
  if [ "$1" -ne "0" ]; then
    echo "$2 - FAILED" | tee -a $LOGFILE
    exit 1
  else
    echo "$2 - SUCCESS" | tee -a $LOGFILE
  fi
}
این یک تابع سودمند کنترل خطاست - این به عنوان ‎ check_err $?‎ نامیده شده - چرا درد سر کنترل هر خطای مهلک ، وقتی می‌توانید فقط یک تابع، که خطا را ثبت و در مورد مقتضی خارج می‌شود، را فرابخوانید؟ تابع ‎ "tee" ‎ خطا را به ترمینال و همچنین فایل لاگ منعکس می‌کند.
check_330()
{
  echo
  echo
  echo "Do you have a SpeedTouch 330 modem? "
  echo " (If you say Yes, the 1.2beta2 driver will be used;"
  echo "  if you say No, the 1.1 driver will be used)."
  echo "Please answer Yes or No"
  read ans
  a=`echo $ans | awk '{ print $1 }' | cut -c1 | tr '[A-Z]' '[a-z]'`
  if [ "$a" == "y" ]; then
     SPEEDTOUCH=speedtouch-1.2-beta2
  fi
  echo "Using $SPEEDTOUCH"
  echo
  echo
}
این فقط یک سؤال ساده می‌پرسد، و متغیر SPEEDTOUCH را نسبت به پاسخ به روزرسانی می‌کند. سطر ‎ awk/cut/tr‎ فقط کاراکتر اول ورودی را می‌گیرد و به حرف کوچک تبدیل می‌کند( این روش مطمئن است، به طوری‌که می‌دانم ابزار tr گنو می‌تواند این را انجام دهد ) و کنترل می‌کند که آیا کاربر گفته ‎ "y" ‎.
check_config()
{

  # Check we're on Linux
  $UNAME -a >> $LOGFILE
  $UNAME -a|grep -qi Linux 
  if [ "$?" -ne "0" ]; then 
    echo "Sorry, this script only supports the GNU/Linux operating system."
    echo "FreeBSD support is planned for the distant future." 
    echo "If you want to help support of another OS, please contact me at"
    echo "steve at steve-parker dot org"
    exit 1
  fi

این تابع کنترل می‌کند که آیا ماشین آماده پیکربندی مودم می‌باشد - قبل از این که کار را شروع کنید، این کنترل ارزشمندی است.
  required_files_installed=1
  type $LSPCI > /dev/null 2>&1
  if [ "$?" -ne "0" ]; then
    # Try Mandrake's name for it... why do they have to rename core utilities?
    LSPCI=lspcidrake
  fi
  # Check we can find our required binaries 
  for required_binary in $PPPD $LSPCI $UNAME tar cp rm gcc make mkdir ls cat chown chmod read ping ifconfig
  do
    type ${required_binary} > /dev/null 2>&1
    if [ "$?" -ne "0" ]; then
      echo "Error: Cannot find ${required_binary}. Please check"
      echo "the PATH environment variable, and that you are running"
      echo "as root. Your PATH variable is currently:"
      echo $PATH
      echo "Error: Cannot find ${required_binary} in $PATH" >> $LOGFILE
      required_files_installed=0
    fi
  done

این اسکریپت فایل‌های متنوعی احتیاج دارد، لازم است کنترل کنیم که وجود دارند(تمام توزیع های نصب شده لینوکس شامل تمام اینها نمی‌باشند )بنابراین با ارزش است، قبل از اینکه در نیمه راه آن را انجام دهیم، با کنترل آن که همه چیز درست کار می‌کند، وقت اشحاص را ذخیره کنیم.
  # Flag for speedmgmt or speedtch in use...
  alcatel_inside=0
  for unrequired_files in /usr/sbin/speedmgmt
  do
    if [ -f ${unrequired_files} ]; then
      echo "You have the Thomson drivers installed."
      echo "These are not required by this speedtouch usermode driver."
      ps -eaf|grep -w speed[m]gmt > /dev/null 2>&1
      if [ "$?" -eq "0" ]; then
        echo "The Thomson speedmgmt driver seems to be running."
        echo "Please \"pkill speedmgmt\" driver before proceeding."
	alcatel_inside=1
      else
	echo "Fortunately, the Thomson speedmgmt daemons"
        echo "does not appear to be running."
      fi
    fi
  done

  lsmod | grep -w "^speedtch" > /dev/null 2>&1
  if [ "$?" -eq "0" ]; then 
    echo "The kernel speedtch module is loaded. This is not"
    echo "compatible with the speedtouch usermode driver."
    echo "Please \"rmmod speedtch\" before running speedtouchconf.sh."
    alcatel_inside=1
  fi

  if [ "$alcatel_inside" -ne "0" ]; then
    exit 1
  fi
دو ناسازگاری درایوری برای این دستگاه وجود دارد( یکی از Thomson، یکی در توسعه 2.5 کرنل ) - اکثر اسکریپت‌ها پیش‌نیازهای تشخیص آنها را دارند. آنها را قبلاً با فرض آن که با آنها روبرو شده‌اید، کنترل کنید. شما فقط یکبار کد را می‌نویسید، اگر ۱۰۰ نفر کد را به کار ببرند، صرف یک ساعت وقت شما، ذخیره ۱۰۰ ساعت وقت دیگران است.
در اجرای درازمدت، وقت شما نیز - در گزارش اشکال‌ها - ذخیره می‌شود. این دو کنترل بعد از آن که افراد با مشکلات با من تماس گرفتند، اضافه شدند. پس از افزودن این تست‌ها من از هیچکس نشنیده‌ام که با این مشکل روبرو شده باشد -احتمالاً پس از آن هیچکس مشکل نداشته، یا آنها قادر بوده‌اند خودشان آن را برطرف نمایند.

  # Assume /etc/ppp exists
  mkdir -p /etc/ppp > /dev/null 2>&1
به وجود دایرکتوری ‎/etc/ppp‎ احتیاج دارد - اگر می‌توانید یک مشکل را به آسانی رفع کنید، فقط آن را بررسی نکنید.

  if [ "$PREFIX" != "/" ]; then
    echo "Using prefix of $PREFIX - note that this is untested!"
    mkdir -p $PREFIX 2>/dev/null
  fi
من وقتی شروع به نوشتن این اسکریپت کردم این متغیر را این جا گذاشتم - اگر با سولاریس ردهت آشنا هستید، به ترتیب فکر کنید JumpStart، یا KickStart. من هیچ تست نکرده‌ام، گر چه، چنین هشدار دادم. یک «ویژگی‌آینده» برای حالتی که به آن احتیاج شود، می‌باشد. گذاشتن چنین چیزهایی در آغاز، ساده‌تر از پاشنه‌کشیدن بعدی برای آنهاست.

  # Check for microcode in speedmgmt.tar.gz, mgmt.o, alcaudsl.sys
  if [ -f speedmgmt.tar.gz ]; then
    echo "Using speedmgmt.tar.gz for microcode"
    tar xzf speedmgmt.tar.gz
    MICROCODE=/etc/ppp/mgmt.o
    cp mgmt/mgmt.o $MICROCODE
    rm -rf mgmt
  else
    if [ -f mgmt.o ]; then
      echo "Using mgmt.o for microcode"
      MICROCODE=/etc/ppp/mgmt.o
      cp mgmt.o $MICROCODE
    else
      if [ -f ALCAUDSL.SYS ]; then 
        cp ALCAUDSL.SYS alcaudsl.sys
      fi
      if [ -f alcaudsl.sys ]; then
        echo "Using alcaudsl.sys for microcode"
        MICROCODE=/etc/ppp/alcaudsl.sys
        cp alcaudsl.sys $MICROCODE
      else
        echo "ERROR: Cannot find microcode" | tee -a $LOGFILE
        echo "Please place a copy of the Microcode in this directory."
        echo "This could be :"
        echo "  - the speedmgmt.tar.gz file from http://www.speedtouchdsl.com/dvrreg_lx.htm"
        echo "  - mgmt.o from speedmgmt.tar.gz"
        echo "  - alcaudsl.sys from the Windows software (Eg C:\\WINDOWS\\SYSTEM\\ALCAUDSL.SYS)"
        echo "Due to the license, you must obtain this file for yourself."
        exit 3
      fi 
    fi
  fi
این مودم به یک فایل از تولید کننده نیاز دارد، که قبل از این‌که بتوانید از آن استفاده کنید، باید به داخل مودم بارگذاری شود، مجوز آنها مرا از توزیع آن همراه با اسکریپت منع می‌کند - هر کاربر باید آن را برای خودش تهیه کند. به این دلیل، دستورالعمل‌های اسکریپت می‌گوید آن را به این یا آن شکل در همان دایرکتوری که اسکریپت هست قرار بدهید. حالا شما کنترل کنید که یکی از این فایل‌ها حاضر باشد. ما از متغیر عمومی ‎ $MICROCODE‎ استفاده می‌کنیم، زیرابه طور واقعی نمی‌دانیم کدام فایل موجود است، فقط برای برنامه ‎ speedtouch.sf.net‎ لازم است، وجود داشته باشد.
در اولین نمونه، فایل آرشیو ‎(speedmgmt.tar.gz)‎ دارای فایل ‎mgmt/mgmt.o‎ می‌باشد، دومی برای آن است که اگر کاربر فایل‎ mgmt.o‎ را فراهم نموده باشد، و سومی برای حالتی که اگر کاربر یا فایل ‎ ALCAUDSL.SYS‎ یا ‎alcaudsl.sys ‎ (فایل ویندوز ) را فراهم کرده باشد - درایور می‌تواند هریک از اینها را استفاده کند، ما فقط به شناسایی وانتقال آنها نیاز داریم.

  # Check for speedtouch.sf.net tarball
  if [ -f ${SPEEDTOUCH}.tar.bz2 ]; then
    TARBALL=${SPEEDTOUCH}.tar.bz2
    type bzcat > /dev/null 2>&1
    if [ "$?" -ne "0" ]; then
      echo "You have supplied the .tar.bz2 version, but do not have bzcat installed."
      echo "Please download the .tar.gz version from http://speedtouch.sf.net/"
      echo "or install bzcat on your system."
      # Do not exit; fall through to .tar.gz
    fi
  else if [ -f ${SPEEDTOUCH}.tar.gz ]; then
      TARBALL=${SPEEDTOUCH}.tar.gz
  else
      echo "Cannot find ${SPEEDTOUCH} tarball (tried .tar.gz and .tar.bz2)" | tee -a $LOGFILE
      exit 1
    fi
  fi
  echo "Using Tarball $TARBALL" >> $LOGFILE
این اسکریپت یکی از دو درایور را به کار می‌برد - درایور نسخه1.1پایدار، یا درایور نسخه بتا 1.2برای مدل جدیدتر 330. این قسمت از تابع کنترل می‌کند که فایل مناسب در دسترس باشد.
از متغیر اصلی ‎ speedtouch-1.1‎، متغیر TARBALL را برای اشاره به فایل واقعی ‎ speedtouch-1.1.tar.gz‎ یا ‎ speedtouch-1.1.tar.bz2‎ تجدید می‌کند، وابزار مناسب خارج کردن از حالت فشرده ، در دسترس است.
FIXME: تغییر مکان این قسمت از این جا به بالای تابع ‎، get_tarball()‎ با ارزش است - فقط خارج کردن از حالت فشرده و اشاره به دایرکتوری...این است، آن چیزی که بازبینی کد خودتان به طور تفصیلی، می‌تواند فراهم کند. امیدوارم یک نگارش جدید از اسکریپت، این ویژگی را شامل شود - هرچند، این صفحه احتمالاً، با این نگارش از کد، ثابت می‌ماند. برای وسواس مدرسه‌ای من حدی هست:-)

  error=0
  PPP_VERSION=`$PPPD --version 2>&1 | awk '{ print $3 }'`
  KERNEL=`$UNAME -r`

  KERNEL_MAJOR=`echo $KERNEL | cut -d"." -f1,2`
  KERNEL_MINOR=`echo $KERNEL |sed s/"[a-z]"/"."/g|sed s/"[A-Z]"/"."/g|tr '-' '.' | cut -d"." -f3`
  TWO_FOUR_OR_NEWER=`echo "$KERNEL_MAJOR >= 2.4" | bc`

  USB_TYPE=`$LSPCI -v |grep -i usb|grep HCI`

  if [ "${PPP_VERSION}" == "2.4.0" ] || [ "${PPP_VERSION}" == "2.4.1" ]; then
    echo "  PPP version $PPP_VERSION okay."
  else
    echo "PPP Version ${PPP_VERSION} should be 2.4.0 or 2.4.1" | tee -a $LOGFILE
    error=`expr $error + 1`
  fi
  if [ "$TWO_FOUR_OR_NEWER" == "0" ]; then
    if [ "$KERNEL_MAJOR" == "2.2" ] && [ "$KERNEL_MINOR" -ge "18" ]; then
      echo "With the 2.2.18 kernel you should get away with $PPP_VERSION" | tee -a $LOGFILE
      echo "... maybe." | tee -a $LOGFILE
    else
      echo "You probably need the HDLC kernel patch n_hdlc.c.diff" | tee -a $LOGFILE
      error=`expr $error + 4`
    fi
  else
    echo "  Linux kernel version ${KERNEL_MAJOR}.${KERNEL_MINOR} okay."
  fi
در این‌جا متغیر error به عنوان یک نقشه بیت از خطاها به کار رفته - برای فهمیدن نقشه بیت‌ها، تعریف دوم ‎ (aka binary) ‎ را بخوانید. این به آن معنی است، که می‌توانیم چندین خطا را کنترل نموده و همه مشکلات بالقوه را یکباره گزارش کنیم،به جای آن که مردم یک مشکل را تا پیدا شدن مورد بعدی رفع کنند، یک ساعت برای برطرف کردن آن صرف کنید، سپس مشکل دیگری را که آنها نمی‌توانند رفع نمایند پیدا کنید. به آنها سرراست بگویید که چه چیزهایی نیاز به تعمیر دارد.
بنابراین ما با کنترل نسخه کرنل لینوکسی که آنها اجرا کرده‌اند، شروع می‌کنیم. همچنین، ما نسخه PPPیا ‎(pppd)‎ که آنها اجرا کرده‌اند را کنترل می‌کنیم، چون این نیز در این‌جا با اهمیت است. با نسخه داده شده ما پی‌آمدهای بالقوه را گزارش می‌کنیم.
تمام این اسکریپت بر مبنای مستندات موجود در SourceForge است، امابرای ذخیره وقت افراد و کاهش زحمت فهمیدن تمام آن، نوشته شده است. بنابراین سیستم‌های آنها را کنترل می‌کنیم و قبل ازاین‌که بتوانند از این مودم بدقلق استفاده کنند، هرچیزی که لازم است به روزرسانی شود را می‌گوییم.

  if [ -z "${USB_TYPE}" ]; then
    echo "No USB Bus found!" | tee -a $LOGFILE
    error=`expr $error + 2`
  fi
  echo ${USB_TYPE} | grep -q UHCI 
  if [ "$?" -eq "0" ]; then 
    USB_TYPE=UHCI
  else 
    USB_TYPE=OHCI
  fi 
همین طور هم پس از آن لازم است بدانیم، آنها چه نسخه‌ای از USB در سیستم خود دارند. این به طور سخت گیرانه‌ای لازم نیست، اما میتوانیم بارگذاری ماژول صحیح را امتحان کنیم نماییم.
FIXME: شاید می‌توانستیم فقط هر دو ماژول UHCI و OHCI ، رابدون کنترل برای خطاها، بارگذاری کنیم ( به هر حال کنترل نمی‌کنیم ) و فرض کنیم که کار خواهد کرد. ساده‌سازی مسائل EHCI که من فقط امشب شنیده‌ام و ممکن است رایج‌تر باشد

  ls -l /dev/ppp|grep -wq 108 
  if [ "$?" -ne "0" ]; then
    cd /dev
    ./MAKEDEV ppp
    if [ "$?" -ne "0" ]; then
      echo "MAKEDEV failed" | tee -a $LOGFILE
      error=`expr $error + 16`
    fi
  fi
  ls -l /dev/ppp|grep -wq 108 
  if [ "$?" -ne "0" ]; then
    echo "/dev/ppp cannot be created, or is not device 108"
    error=`expr $error + 32`
  fi
ما به دستگاه ‎ /dev/ppp‎ نیاز داریم، و باید عدد major آن 108 باشد(مترجم: در یونیکس هر فایل از نوع device یک major ID دارد که تعیین کننده نوع آن دستگاه می‌باشد. این عدد در خروجی ‎ ls -l‎ نمایش داده می‌شود)، اگر وجود نداشته باشد، سعی می‌کنیم آن را ایجاد کنیم. بعد کنترل می‌کنیم، باید از نوع 108 باشد، اگر نبود خطا را به طوری‌که بعد بتواند به کاربر گزارش شود، ثبت می‌کنیم.

  if [ "`id -u`" != "0" ]; then
    echo "You must be logged in as root to use this script"
    exit 1
  fi
 
  if [ "$required_files_installed" -eq "0" ]; then
    echo "Some required files are not installed. Please install these"
    echo "(from your Linux install media, or the internet) before"
    echo "you can configure and install the speedtouch software."
    exit 1
  fi

  echo "--- Environment ---" >> $LOGFILE
  set >> $LOGFILE
  echo "--- End of Environment ---" >> $LOGFILE
}
حالا چیزهایی را که یافته‌ایم کنترل می‌کنیم: آیا شما کاربر ارشد هستید؟ من مایل هستم این مورد را آخر کنترل کنم، چون وقتی اسکریپت را بررسی می‌کنم، ترجیح می‌دهم به عنوان کاربر ارشد نباشم و ریسک نقض پیکربندی جاری وجود نداشته باشد.
همچنین کنترل میکنیم که فایل‌های لازم موجود باشند، در این حالت لازم است پیغام مناسبی ارائه کنیم، چون احتمالاً شخصی بدون ابزارهای پیشرفته نصب شده، به کمک اضافی احتیاج دارد.
get_tarball()
{
  echo "$TARBALL" |grep -q "gz$"
  if [ "$?" -eq "0" ]; then
    tar -xzf $TARBALL
    cd `basename $TARBALL .tar.gz`
  else
    bzcat $TARBALL | tar -xf -
    cd `basename $TARBALL .tar.bz2`
  fi
  if [ "$PREFIX" != "/" ]; then
    config="./configure --prefix $PREFIX/usr"
  else
    config="./configure"
  fi
  echo "Configururing SpeedTouch Driver..." | tee -a $LOGFILE
  if [ "$QUIET" == "YES" ]; then
    $config > /dev/null 2>&1
    res=$?
  else 
    $config
    res=$?
  fi
  check_err $res "Software Configuration"
  echo "Building SpeedTouch Driver..." | tee -a $LOGFILE
  if [ "$QUIET" == "YES" ]; then
    make > /dev/null 2>&1
    res=$?
  else
    make
    res=$?
  fi
  check_err $res "Software Build"
  echo "Installing SpeedTouch Driver..." | tee -a $LOGFILE
  if [ "$QUIET" == "YES" ]; then 
    make install > /dev/null
    res=$?
  else
    make install 
    res=$?
  fi
  check_err $res "Software Installation"
  rm -rf /tmp/speedtouch.$$
}
برای این نسخه اسکریپت لازم است، کاربر فایل‌های آرشیو شده مناسب خود را از 3rd-party utility دانلود نماید. ( چون مجوز این برنامه GPL است، اسکریپت GPL من حالا نسخه‌های مختلف آن را شامل شده است).
این تابع سعی می‌کند دریابد چه نوع فایل tarball را آن‌ها در این دایرکتوری قرار داده‌اند - این فایل آرشیو، هم میتواند یک فایل ‎ tar.gz ‎ یا یک فایل ‎ tar.bz2 ‎ باشد - متغیر TARBALL قبلاً روی آن تنظیم شده بود.
سپس تابع فایل آرشیو را با فرمان‌های مناسب استخراج می‌کند، و سراغ ترجمه کد می‌رود.
برای اجتناب از آزار کاربران، خروجی را به ‎/dev/null ‎  ارسال می‌کند و فقط موفقیت یا شکست را گزارش می‌کند. این موضوع، مرا به عنوان مؤلف چند بار نیش زده ـ نگارش بعدی اسکریپت خروجی را در ‎ /tmp ‎، دخیره خواهد نمود، به طوری که درصورت عدم موفقیت، اسکریپت افراد را به ارسال خروجی دستور ناموفق به من، هدایت نماید - به آن ترتیب من، نسبت به آن که آنها دوباره به طور دستی آن را انجام داده و خروجی را به من ارسال کنند، بهتر می‌توانم مشکل آنها را تشخیص بدهم.

create_ppp_files()
{
echo "Creating ppp files in $PREFIX/etc/ppp" >> $LOGFILE
  cd $PREFIX/etc/ppp
  mv options options.bak 2>/dev/null 
  cat - > options << EOF
#------------------ /etc/ppp/options Beginning -------------
noauth
usepeerdns
lock
noipdefault
#------------------ /etc/ppp/options End ------------------
EOF
  mkdir peers 2>/dev/null
  cat - > peers/adsl <> peers/adsl
echo "sync" >> peers/adsl
echo "user \"$ISP_LOGIN\"" >> peers/adsl
cat - >> peers/adsl << EOF
noauth
noaccomp
nopcomp
noccp
novj
holdoff 4
persist
maxfail 25
usepeerdns
#------------------/etc/ppp/peers/adsl EOF------------------
EOF

# Running this script multiple times could add multiple entries
# in these files ... check for "Added by speedtouchconf" to avoid this.
grep -v "Added by speedtouchconf" chap-secrets > chap-secrets.new
grep -v "Added by speedtouchconf" pap-secrets > pap-secrets.new
echo "\"$ISP_LOGIN\" \"*\" \"$ISP_PASSWORD\" \"*\" # Added by speedtouchconf" >> chap-secrets.new
echo "\"$ISP_LOGIN\" \"*\" \"$ISP_PASSWORD\" \"*\" # Added by speedtouchconf" >> pap-secrets.new
mv chap-secrets.new chap-secrets
mv pap-secrets.new pap-secrets

# Ensure security - only "root" should be able to read these files
chown root pap-secrets chap-secrets
chmod 600 pap-secrets chap-secrets

# Just do an ls -l of these files; don't want passwords in logfiles.
# This should be enough for basic sanity-checks.
ls -l /etc/ppp/peers/adsl /etc/ppp/*-secrets /etc/ppp/options >> $LOGFILE
}
تابع create_ppp_files فایل‌های مختلف مورد نیاز را در ‎/etc/ppp/ ‎ ایجاد می‌کند - وقتی فایل‌های سیستم شخص دیگری را ویرایش می‌کنید، همیشه اول پشتیبان بگیرید!
سپس برای ریختن متن در فایل از این ترفند‎"cat - > file << EOF" ‎  استفاده کنید.
همچنین اسکریپت نام لاگین و کلمه عبور ISP کاربر را به فایل‌هایی که احتیاج دارد اضافه می‌کند.
ممکن بود یک کاربر اسکریپت را اجرا نموده و اطلاعات اشتباه وارد کند، و بعد بخواهد دوباره اسکریپت را اجرا نماید، متأسفانه، pppd مقدار اولیه را می‌خواند و آن را باور می‌کند، و تا عدم موفقیت ادامه می‌دهد، زیرا کلمه عبور اشتباه است، حتی با وجود آن که بعد،اطلاعات صحیح در فایل قرار گرفته باشد.
برای اجتناب از این مشکل، اما شروع بدون سروکار داشتن با عبارت‌های منظم و کاراکترهای ویژه در کلمه عبور‎ (\, *, etc)‎، بعد از هر سطری که اسکریپت به فایل می‌افزاید، این متن را اضافه می‌کنیم:
Added by speedtouchconf#
. همیشه فقط باید یک سطر در فایل باشد، بنابراین ما با حذف هر سطر speedtouch موجود در فایل آغاز می‌کنیم ، سپس سطر جدید را ( با امید صحت ) اضافه می‌کنیم.
add_line()
{
  grep -q "$1" $3 || echo "$2" >> $3
}
این فقط یک برنامه ساده برای افزودن سطر ‎"$2"‎ به فایل ‎"$3"‎ ، در صورتی‌که ‎"$1"‎ از قبل در فایل وجود نداشته باشد، می‌باشد. این بعداً برای ویرایش فایل‌های سیستم استفاده می‌شود.
modify_modules_conf()
{
  if [ -f /etc/modules.conf ]; then
    MODCONF=$PREFIX/etc/modules.conf
  else
    MODCONF=$PREFIX/etc/conf.modules
  fi
echo "Original modules.conf: " >> $LOGFILE
cat $MODCONF >> $LOGFILE
add_line "ppp_generic" "alias char-major-108  ppp_generic" $MODCONF
add_line "dev/ppp" "alias /dev/ppp ppp_generic" $MODCONF
add_line "ppp_async" "alias tty-ldisc-3 ppp_async" $MODCONF
add_line "n_hdlc" "alias tty-ldisc-13 n_hdlc" $MODCONF
add_line "ppp_synctty" "alias tty-ldisc-14 ppp_synctty" $MODCONF
add_line "bsd_comp" "alias ppp-compress-21 bsd_comp" $MODCONF
add_line "ppp-compress-24" "alias ppp-compress-24 ppp_deflate" $MODCONF
add_line "ppp-compress-26" "alias ppp-compress-26 ppp_deflate" $MODCONF
echo "--- New modules.conf: " >> $LOGFILE
cat $MODCONF >> $LOGFILE
echo "--- end of new modules.conf" >> $LOGFILE
}
این تابع مستعارها را در صورتی‌که از قبل در فایل ‎ modules.conf‎ وجود نداشته باشند، به آن اضافه می‌کند، تابع قبلی add_line این کار را نسبت به استفاده صریح کنترل‌های هرسطر، خیلی آسان‌تر می‌کند.
توجه کنید که اسکریپت فایل‌های قدیم و جدید‎ modules.conf ‎ را در فایل ثبت وقایع، منعکس ( cat ) می‌کند - نگارش بعدی اسکریپت فقط یک مقایسه( "diff" ) از فایل‌ها را انجام می‌دهد، به طور ویژه، توزیع سوزه، فایل‌های بزرگ ‎ modules.conf ‎ دارد، که فقط فایل ثبت وقایع را برای خواندن دشوار می‌سازد.
do_modprobe()
{
echo "Doing modprobes ... ">> $LOGFILE
modprobe ppp_generic | tee -a $LOGFILE
modprobe ppp_synctty | tee -a $LOGFILE
modprobe n_hdlc | tee -a $LOGFILE
modprobe usbcore | tee -a $LOGFILE
mount none /proc/bus/usb -t usbdevfs > /dev/null 2>&1
if [ "$USB_TYPE" == "UHCI" ]; then
  USB_INTERFACE=usb-uhci
  modprobe usb-uhci | tee -a $LOGFILE
  if [ "$?" -ne "0" ]; then
    USB_INTERFACE=uhci
    modprobe uhci  | tee -a $LOGFILE
  fi
else
  modprobe usb-ohci | tee -a $LOGFILE
  USB_INTERFACE=usb-ohci
fi
echo "lsmod output:" >> $LOGFILE
lsmod >> $LOGFILE
echo "df -k : " >> $LOGFILE
df -k >> $LOGFILE
}
تابع do_modprobe ماژول‌هایی را که ممکن است مورد نیاز باشند، کاوش می‌کند - اگر ماژول‌ها در نصب موفق نباشند، نگران نمی‌شود، شاید کرنل به صورت یک پارچه ساخته‌شده‌خانگی، باشد، ماژول‌ها ممکن است از قبل نصب شده باشند، و غیره.
همچنین به عنوان یک نگهدارنده این اسکریپت، نگران افرادی که خودشان کرنل‌هایشان را ترجمه می‌کنند، نیستم - آنها خودشان می‌توانند این مودم را برای خود پیکربندی کنند.
به طور عمومی، افرادی که از این اسکریپت استفاده می‌کنند، توزیع‌های لینوکسی که برای هرچیزی از ماژول هااستفاده می‌کنند،را به کار می‌برند، وآن توزیع‌ها برای اینگونه موارد خوب کنترل شده،می‌باشند.
فقط چیزهایی را تست کنید، که می‌توانید کاری در مورد آن انجام دهید: اگر یک ماژول مورد نیاز است، نه ترجمه کرنل، که قبلاً بارگذاری نشده و بارگذازی آن ناموفق بوده، بعد موضوع پیچیده دلپذیری است، که یک اسکریپت عمومی مانند این محتمل نیست که به هرحال قادر به کار کردن باشد، و دارنده چنان سیستمی احتمالاً قادر به کشف آن برای آنها باشد.
تابع فقط سعی می‌کند دوباره ماژول xHCI مناسبی را بارگذاری نماید، شاید این زیاده روی باشد.
در نهایت، خروجی "lsmod" را به فایل لاگ می‌فرستد، و دستور ‎ "df -k" ‎ برای نمایش فایل‌سیستم‌های usb متصل شده به سیستم است.

select_options()
{
ans="N"
while [ "$ans" != "Y" ]; do
echo "***************************************"
echo "*                                     *"
echo "*   Please select your ISP Settings   *" 
echo "*                                     *"
echo "***************************************"
echo
cat - << EOF
  Country/ISP	        VPI    VCI
  Belgium, ?	          8     35
  Denmark, Orang          8     35
  France, wanado          8     35
  France, ?	          8     67
  Italy, ?	          8     35
  Netherlands, ?          8     48
  UK, BTopenworld         0     38
  UK, Any ISP             0     38
  US, BellSouth	          8     35
  Singapore Pacificnet    0    100
EOF
  echo "Please type your VPI VCI numbers (eg, 0 38) for UK"
  read VPI VCI
  echo "Please enter your ISP Login ID (eg another@hg1.btinternet.com)"
  read ISP_LOGIN
  echo "Please enter your ISP Password"
  read ISP_PASSWORD

  echo "Settings: "
  echo "  VPI / VCI : $VPI / $VCI"
  echo "  Login     : $ISP_LOGIN"
  echo "  Password  : $ISP_PASSWORD"
  echo "Are these correct? (Y/N)"
  read ans
  ans=`echo ${ans}N|tr '[a-z]' '[A-Z]'|cut -c1`
done
echo "VPI: $VPI VCI: $VCI" >> $LOGFILE
}
این تابع اصلی است که با کاربران گفتگو می‌کند،از آنها سه مورد کلیدی، که برای آنها منحصر به فرد است، می‌پرسد: ISP آنها، نام کاربری، وکلمه عبور آنها.
هنگامی‌که چنین اطلاعاتی از کاربر اخذ می‌شود، همیشه شانس بازبینی و تأیید را به آنها می‌دهد - حلقه while در این تابع با کنترل متغیر "ans" این کار را انجام می‌دهد - در ابتدا آن را به مورد مشهودی تنظیم کرده و در پایان از ورودی کاربر خوانده می‌شود.
به این طریق، کاربر می‌تواند در این بخش،تا موقعی که می‌خواهد، حرکت کند و ما قبل از آن که پیش برویم و بر اساس ورودی، هرگونه پیکربندی را انجام دهیم، از صحت اطلاعات مطمئن گردیم.
setup_etc_conf(
{
CONF=$PREFIX/etc/speedtouch.conf
echo "# SpeedTouch Config File" > $CONF
echo "# Created by speedtouchconf.sf.net version $VERSION" >> $CONF
echo "# The speedtouch rc script assumes /usr/local/sbin is in the path..." >> $CONF
echo "# It does a ". /etc/speedtouch.conf", so we can just add it to the PATH here." >> $CONF
echo "PATH=\$PATH:/usr/local/sbin" >> $CONF
echo "# LOAD_ directives should be 1 for modules, 0 if built into the kernel" >> $CONF
echo "LOAD_USBCORE=1" >> $CONF
echo "LOAD_USBINTERFACE=1" >> $CONF
echo "LOAD_NHDLC=1" >> $CONF
echo "# USB Interface - UHCI or OHCI" >> $CONF
USB=`echo $USB_TYPE | tr '[:upper:]' '[:lower:]'`
echo "DEFAULT_USBINTERFACE=\"${USB_INTERFACE}\"" >> $CONF
echo "# Path to microcode (mgmt.o or alcudsl.sys from the official Alcatel drivers" >> $CONF
echo "MICROCODE=\"$MICROCODE\"" >> $CONF
echo "# modem_run verbosity" >> $CONF
echo "VERBOSE=0" >> $CONF
echo "# Set this to 1 if you have configured the script" >> $CONF
echo "CONFIGURED=1" >> $CONF
for rc_dir in /etc/rc.d/init.d /etc/init.d
do
  [ -d "${rc_dir}" ] && break
done
#cp /usr/local/etc/init.d/speedtouch ${rc_dir}
cp ${INITSCRIPT} ${rc_dir}/speedtouch
}
برنامه speedtouch از یک فایل ‎ /etc/speedtouch.conf ‎ استفاده می‌کند - در این جا آن را مطابق سیستم کاربر تنظیم می‌کنیم. تنها مورد تفاوت آن‌ها در نوع xHCI USB ونام microcode مورد استفاده آنهامی‌باشد ( این مودم ها تحت نام‌های متنوعی توزیع می‌شوند ).
check_resolv_conf()
{
  if [ -f /etc/resolv.conf ]; then
    mv /etc/resolv.conf /etc/resolv.conf.orig
  fi
  cd /etc
  ln -sf ppp/resolv.conf resolv.conf

  ping -c1 www.google.com > /dev/null
  if [ "$?" -eq "0" ]; then
    echo "Fixed DNS ... it's working!" | tee -a $LOGFILE
  else
    echo "Looks like /etc/ppp/resolv.conf is wrong." | tee -a $LOGFILE
    echo "You need to check the DNS configuration." | tee - a $LOGFILE
    echo "Look in /var/log/messages to see if DNS was configured." | tee -a $LOGFILE
    DNS=NOTOK
  fi
}
این تابع در صورتی‌که DNS پیدا نشود، فراخوانی می‌شود،
فایل ‎ /etc/resolv.conf‎ برای پیدا کردن DNS استفاده می‌شود، با یک تنظیم PPP ، باید به فایل ‎ /etc/ppp/resolv.conf‎ اشاره کند. اگر فایل ‎/etc/resolv.conf‎ از قبل موجود باشد، pppd آن را تعویض نمی‌کند، بنابراین ما کنترل می‌کنیم، اگر موجود بود آن را کنار می‌گذاریم و لینک را تنظیم می‌کنیم.
سپس دوباره DNS را کنترل می‌کنیم ومطابق ( رفع عیب شده یا هنوز کار نمی‌کند ) گزارش می‌کنیم.
check_router()
{
  route=`netstat -rn|grep "^0\.0\.0\.0"|awk '{ print $2 }'`
  if [ ! -z "${route}" ]; then
       echo "You have a default router : $route (removing it for you!)" | tee -a $LOGFILE
       route delete default gw $route
  fi
}
اگر سیستم از قبل مسیریاب پیش‌فرضی استفاده می‌نموده، pppd آن را تعویض نخواهد کرد - این به آن معنی است که کاربر می‌تواند ارتباط بگیرد، اما قادر نخواهد بود بسته‌ها رابه اینترنت ارسال کند یا از آن دریافت نماید.
این تابع مسیریاب را از یک سیستم در حال اجرا پاک می‌کند، امااز نظر پیکربندی ، خیلی وابسته به توزیع است، این به طور درازمدت مشکل را رفع نمی‌کند: موقعی که کاربر راه‌اندازی مجدد می‌نماید، مسیریاب پیش‌فرض دوباره در آن‌جا خواهد بود.
اسکریپت فقط به کاربر می‌گوید که خودش آن را برطرف نماید.
یک نگارش بعدی از اسکریپت ممکن است با تعدادی از توزیع‌ها برای برطرف کردن بلند مدت این مشکل کار کند، اما کاملا بغرنج است.
# main script starts here

clear
echo
echo "************************************************"
echo "*                                              *"
echo "*       speedtouchconf.sh by Steve Parker      *"
echo "*                                              *"
echo "*    http://speedtouchconf.sourceforge.net/    *"
echo "* based on speedtouch.sourceforge.net project  *"
echo "*                                              *"
echo "************************************************"
echo 
echo "If you have any problems with this script, mail me"
echo "(steve at steve-parker dot org) with the files"
echo "$LOGFILE and /var/log/messages for diagnosis."

if [ -f $LOGFILE ]; then
  mv $LOGFILE ${LOGFILE}.old
fi

echo "Starting speedtouch.sh script" > $LOGFILE
echo "Version ${VERSION}" >> $LOGFILE
date >> $LOGFILE
echo "Called as $0 from `pwd`" >> $LOGFILE
INITSCRIPT=`pwd`/speedtouch-init
check_330
check_config
if [ "$error" -ne "0" ]; then
  echo "Not ready to install the software at this time. - code $error" | tee -a $LOGFILE
  exit 1
fi
select_options
echo "No further user interaction is required." | tee -a $LOGFILE
get_tarball
create_ppp_files
modify_modules_conf
do_modprobe
check_router
setup_etc_conf
echo
echo "   *** Configuration finished. Starting the connection ***"
echo
echo "The modem lights should start flashing for 20 seconds..." | tee -a $LOGFILE
echo "You may get one or two timeout or USBDEVFS_BULK failed messages" 
echo "now - ignore them unless there are lots." 
echo "You will get these messages whenever you connect - it is safe to ignore them."
$MODEM_RUN -m -f $MICROCODE
res=$?
if [ "$res" -eq "0" ]; then
  echo "Phew! That was the hard part! Should be plain sailing now..." | tee -a $LOGFILE
else
  echo "The modem_run command failed (code $res)- check your kernel config" | tee -a $LOGFILE
  if [ "$res" -eq "255" ]; then
    echo "  This *may* not be a problem if you've already loaded the microcode" | tee -a $LOGFILE
    echo "  (for example, if you ran this script earlier without powering off" | tee -a $LOGFILE
    echo "  the modem)." | tee -a $LOGFILE
  fi
  #exit 1
fi
sleep 10
echo "Running : $PPPD call adsl" | tee -a $LOGFILE
$PPPD call adsl
echo "pppd return code $?" >> $LOGFILE
sleep 10
echo "--- ifconfig -a output ---" >> $LOGFILE
ifconfig -a >> $LOGFILE
echo "--- netstat -rn output ---" >> $LOGFILE
netstat -rn >> $LOGFILE

DNS=OK
PPP0=NOT_OK
ifconfig ppp0 | grep "inet addr:"
if [ "$?" -eq "0" ]; then
  PPP0=OK
  echo "Looks like we're online... " | tee -a $LOGFILE
  ping -c1 www.google.com > /dev/null
  if [ "$?" -eq "0" ]; then
    echo "Hey look, I can see the Net from here!" | tee -a $LOGFILE
  else
    echo "Cannot ping www.google.com - trying steve-parker.org by numeric IP" | tee -a $LOGFILE
    ping -c1 195.224.68.226 > /dev/null 
    if [ "$?" -eq "0" ]; then
      echo "Looks like DNS might be iffy ... sorting it out" | tee -a $LOGFILE
      check_resolv_conf
    else
      echo "I can't ping even without DNS" | tee -a $LOGFILE
    fi
  fi
else
  echo "****************************************"
  echo "* Oops - don't seem to have connected. *" | tee -a $LOGFILE
  echo "****************************************"
fi

echo "--- dns ---" >> $LOGFILE
ls -l /etc/resolv.conf /etc/ppp/resolv.conf >> $LOGFILE 2>&1
echo "--- /etc/resolv.conf ---" >> $LOGFILE
cat /etc/resolv.conf >> $LOGFILE
echo "--- /etc/ppp/resolv.conf ---" >> $LOGFILE
cat /etc/ppp/resolv.conf >> $LOGFILE
echo "--- end of diags ---" >> $LOGFILE


echo "Configuration finished." | tee -a $LOGFILE
echo "Any potential problems are listed below:"
if [ "$DNS" != "OK" ]; then
  echo "The connection is established, but there seems to be some"
  echo "problem with DNS (looking up the names of internet hosts)"
fi
if [ ! -z "${route}" ]; then
  echo
  echo "You have a default route configured."
  echo "You need to disable this, as there can only be one default route."
  grep -q "GATEWAY=" /etc/sysconfig/network 2>/dev/null
  if [ "$?" -eq "0" ]; then
    echo "You need to remove the GATEWAY= line from /etc/sysconfig/network."
  else
    if [ -f /etc/sysconfig/network/routes ]; then
      echo "You need to remove the \"default\" line from /etc/sysconfig/network/routes"
    fi
  fi
  echo
fi

echo "To automatically dial-in when the PC boots up : " | tee -a $LOGFILE
if [ -f /etc/debian_version ]; then
  echo "  update-rc.d speedtouch start 90 2 3 4 5 . stop 10 0 1 6 ." | tee -a $LOGFILE
else
  echo "  cd ${rc_dir}; chkconfig speedtouch on" | tee -a $LOGFILE
fi
echo
echo "You can connect and disconnect with the ${rc_dir}/speedtouch script,"
echo "passing either stop or start as the only parameter."

if [ "$PPP0" == "OK" ]; then
  echo "You are now connected. There is no need to run this"
  echo "speedtouchconf.sh script again."
  echo "You can stop and start the interface with "
  echo "  ${rc_dir}/speedtouch stop"
  echo "  ${rc_dir}/speedtouch start"
fi

exit 0
این اسکریپت اصلی است.
به طور سؤال برانگیزی این بخش خیلی طولانی است، و باید به چند تابع مختلف مجزا می‌شد، اما تا اندازه‌ای قابل مدیریت است.
با کنترل تنظیم (check_config) شروع می‌شود و در صورت شکست، از ادامه خودداری می‌کند.
بعد اطلاعات کاربر را در یافت می‌کند (select_options).
با یک موفقیت check_config و اطلاعات معتبر کاربر، حالا اسکریپت باید موفق شود.
توابع تعریف شده در بالا را به ترتیب مناسب فراخوانی می‌کند، سپس شروع به برقراری ارتباط با اینترنت می‌نماید.

در سطر «پیکربندی تمام شد. شروع برقراری ارتباط»، اتصال را شروع می‌کند، وسعی می‌کند هر مشکلی را در هر نقطه شناسایی نماید.
بیشترین بازخورد دریافتی ازکاربران را در مورد این بخش دریافت کرده‌ام.
این بخش می‌خواهد بدون سر درگم نمودن کاربران تا آن‌جا که ممکن است، پرگو باشد - به آنها بگوید که چه چیز رخ می‌دهد، وبعد انتظار دیدن چه جیز را می‌توانند داشته باشند.
میکروکد بارگذاری شده‌ام را آغاز می‌کند‎ ($MODEM_RUN) ‎ - یک نگارش بعدی از این اسکریپت، یک وصله modem_run را شامل می‌شود، نسخه ‎speedtouch.sf.net‎ فقط همیشه ‎ "-1"‎ ( یعنی ۲۵۵ ) را برای هر خطا برمی‌گرداند، نگارش جدیدتر اسکریپت تشخیص‌های بهتری دارد.
با فرض این که دستور modem_run موفق شود، اسکریپت می‌رود که pppd را فرا بخواند - به ISP کاربر وصل می‌شود، اعتبارسنجی می‌کند، و امیدوارانه در انتظارارتباط با اینترنت می‌ماند.
تنظیمات ifconfig و netstat را در فایل ثبت وقایع، برای مقاصد تشخیصی، می‌نویسد، و بعد شروع به اشکال‌یابی می‌کند.
در سطر ‎ "DNS=OK"‎، روتین اشکال‌یابی‌اش را آغاز می‌کند.
یک آدرس اینترنتی در دستگاه ppp0 کنترل می‌کند - اگر چیزی نباشد، یک خطا گزارش می‌کند( در واقع، این خطا اکثراً نشان دهنده نام یا کلمه عبور اشتباه می‌باشد).
اگر یک آدرس داشته باشد، بعد با موفقیت به ISP وصل می‌شود.
سپس در ping کردن  ‎www.google.com ‎ تلاش می‌کند ( که مطمئناً به شبکه متصل است! ) -اگر این مورد ناموفق باشد، سپس دوباره سعی می‌کند‎ steve-parker.org‎ را از طریق آدرس IP آن ping کند - که به راستی باید متصل باشد، و من می‌توانم مطمئن شوم که آدرس IPام ایستا خواهد بود.
بر اساس این نتایج، ممکن است تابع check_resolv_conf را برای برای برطرف نمودن هر مشکل DNS فراخوانی کند.
سپس اسکریپت با ثبت کردن موارد تفصیلی دیگر در فایل ثبت وقایع، - و اعلام آنچه برای نهایی کردن پیکربندی لازم است،به کاربر، اگر آنها مسیریاب پیش‌فرض سیستم را حذف کرده‌اند، و پیشنهادروشی برای ارتباط گرفتن خودکار در موقع بالا آمدن سیستم، تمام می‌کند.
تمامش همین بود - امیدوارم آنها متصل شده باشند، و بدانند که دفعه بعدبه نسبت نیازهایشان چه کار باید بکنند.
Steve Parker  نوشته  Bourne و Bash راهنمای آموزشی اسکریپت نویسی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید