Examples

To really understand how the shell works, you need to see it in action. What follows is a simple examples of real shell script. See if you can understand how it works.

#!/bin/sh
#############################################################################
# FILE        : process
# AUTHOR      : Peter Chapin
# LAST REVISED: September 1999
# SUBJECT     : Sample shell script.
#
#      The following shell script accepts a list of filenames on the command
# line and presents the user with a menu of possible actions for each file in
# that list. Once the user has decided about the disposition of a file, the
# next file is presented.
#############################################################################

if [ ! -w . ] ; then
  echo "No write access to the current directory: Can't continue"
else

  # Loop over all the files specified on the command line.
  for FILENAME in $* ; do

    # Assume that we will stay on this file. Set to "no" below if otherwise.
    RETRY=yes

    # Ignore directories, etc.
    if [ ! -f $FILENAME ] ; then
      echo "$FILENAME is not a plain file: ignoring."
      echo "Strike RETURN to continue...\c"
      read junk
    else

      # Keep presenting the menu until user does something with the file.
      while [ $RETRY = "yes" ] ; do
        echo " "
        echo "\033[2J\033[1;1HFILE: $FILENAME\n"
        echo "  0) No action"
        echo "  T) Type"
        echo "  V) View"
        echo "  N) reName"
        echo "  R) Remove"
        echo "  C) make a new Copy"
        echo "  D) copy to a Directory"
        echo "  Q) Quit"
        echo "Enter command digit: \c"
        read RESPONSE junk

        # Handle each command.
        case $RESPONSE in

          0) # No action.
             RETRY=no;;

        T|t) # Type of file.
             file $FILENAME;;

        V|v) # View file.
             more $FILENAME;;

        N|n) # Rename file. Be sure new name is free for use.
             echo "Enter the new name: \c"
             read NAME junk
             if [ -f $NAME -o -d $NAME ] ; then
               echo "$NAME already exists"
             else
               mv $FILENAME $NAME
               RETRY=no
             fi;;

        R|r) # Remove file (no questions asked).
             rm $FILENAME
             RETRY=no;;

        C|c) # Copy file. Be sure new name is free for use.
             if [ ! -r $FILENAME ] ; then
               echo "Can't read $FILENAME"
             else
               echo "Enter the name of the new copy: \c"
               read NAME junk
               if [ -f $NAME -o -d $NAME ] ; then
                 echo "$NAME already exists"
               else
                 cp $FILENAME $NAME
                 RETRY=no
               fi
             fi;;

        D|d) # Copy to a directory. Be sure name is really that of a dir.
             if [ ! -r $FILENAME ] ; then
               echo "Can't read $FILENAME"
             else
               echo "Enter the name of the destination directory: \c"
               read NAME junk
               if [ ! -d $NAME ] ; then
                 echo "$NAME is not a directory"
               elif [ ! -w $NAME ] ; then
                 echo "Can't write in the directory $NAME"
               else
                 cp $FILENAME $NAME
                 RETRY=no
               fi
             fi;;

        Q|q) exit;;
          *) echo "I don't understand $RESPONSE"
        esac

      echo "Strike RETURN to continue\c"
      read junk

      done  # End of while... loop which waits for RETRY to become "no"
    fi      # End of if...else... which ignores special files.
  done      # End of while... loop which processes all the filenames.
fi          # End of if...else... which checks for writability to .