Benjamin Scott said:

>  If you are not interested in portability to older shells, here are some 
>optimizations:
>
>
>       math=$(( 1 + 1 ))               # internal, easier, nestable
>
>       if [[ a = b ]]; ...             # internal

I've had problems with [[ ]] on pdksh in the past.  [ ] is also 
internal on modern unixen.

>
>  Anyone else have some tips or tricks they would like to share?
>

I've done lots of cross platform scripting.  I find it's better to set 
PATH in the top of the script rather then do things like:

X=$(/usr/bin/ls)

PATH=/usr/bin:$PATH
X=$(ls)

I've also created something like an include file that I . at the top of 
my scripts.  It has functions I use & defines variables for thing like 
mail.  For instance:
  date | $MAILER -s 'feedback' user@site

On linux, MAILER=mail.  Solaris, MAILER=mailx.

Scripts attached.  
#!/bin/ksh

. /shared/scripts/setup.ksh

echo "Variables set in setup.ksh"
echo "--------------------------------------"
echo "PATH:"
echo "  $PATH"


echo ""
echo "- Current running program & logfile ----"
echo "PROG              =       $PROG"
echo "LOGFILE           =       $LOGFILE"


echo ""
echo "- time -------------------------------"
echo "set_HOUR          =       $set_HOUR"
echo "set_MINUTE        =       $set_MINUTE"
echo "set_YEAR          =       $set_YEAR"
echo "set_MONTH         =       $set_MONTH"
echo "set_DAY           =       $set_DAY"


echo ""
echo "- ID the system ----------------------"
echo "set_HOST          =       $set_HOST"
echo "set_SYSREV        =       $set_SYSREV"
echo "set_SYSTEM        =       $set_SYSTEM"
echo "set_ipaddr        =       $set_ipaddr"
echo "set_mask          =       $set_mask"
echo "set_ipmask        =       $set_ipmask"
echo "set_broadaddr     =       $set_broadaddr"


echo ""
echo "- ID the user ------------------------"
echo "set_USER          =       $set_USER"
echo "set_TRUEUSER      =       $set_TRUEUSER"
echo "EDITOR            =       $EDITOR"


echo ""
echo "- commands that change ---------------"
echo "set_pscmd         =       $set_pscmd"
echo "set_RSH           =       $set_RSH"
echo "set_MAILER        =       $set_MAILER"
echo '  ex: $set_MAILER -s "subject line" dest1,dest2 < $FILE'
echo "PAGER             =       $PAGER"
echo "set_lsargs        =       $set_lsargs"

echo 'set_HOSTS - list of hosts /etc/host w/o localhost & comments'
echo $set_HOSTS

echo ""
echo '- useful *functions* -------------------'
echo 'pushd, popd - push & pop directories'
echo 'set_DF   - df in k, not half k'
echo 'set_DFL  - df local disks'
echo ''
echo 'set_psg  - ps | egrep $1 # this is a function, put arg in quotes'
echo 'set_psk  - ps | egrep $1 | egrep -v egrep | awk out $2 | xargs kill'
echo 'set_psk9  - set_psk w/ kill -9'
#! /bin/ksh
# file to . to get all setups

# use:
# . /shared/scripts/setup.ksh

# run /shared/scripts/setup to see what is set

# These are the maximum PATHs
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/etc:/etc:/usr/ucb:/usr/openwin/bin:/usr/bin/X11:/shared/scripts:/usr/local/bin:/usr/local/sbin:/usr/ccs/bin

# IFF you need to add to the PATH, do this:
# PATH=$PATH:/usr/local/bin   # etc...
# because the above paths will not hang.  /usr/local might IFF it's NFS mounted
# and of course /shared/scripts will be available if this is being sourced

PROG=$(basename $0)
LOGFILE="/tmp/${PROG}log.$$"

set_HOST=$(uname -n |cut -d. -f1)

set_SYSREV=$(uname -r)
set_SYSTEM=$(uname -s)
case $set_SYSTEM in
    HP-UX)
        # hp-UX
        set_RSH=remsh
        iparg=lan0
        ;;
    SunOS)
        set_RSH=rsh
        iparg=-a
        case $set_SYSREV in
          5*) # Solaris
              set_lsargs=-l
              ;;
          4*) # SunOS
              set_lsargs=-lg
              ;;
        esac
esac

# Whats the proper ps command?
# test BSD and System V style
psax=$(ps  ax 2>&1 | wc -l)
 pse=$(ps -ef 2>&1 | wc -l)
if [[ $psax -gt $pse ]]
then
  set_pscmd=auxww       # BSDish ps
else
  set_pscmd=-ef # SYSVish ps (btw - OSF picks this one) 
fi
unset psax
unset pse

#
# SYS-V echo?
#
if test "`/bin/echo 'blah\c'`" = "blah\c"
then
        EFLAG="-n"
        ENDER=""
else
        EFLAG=""
        ENDER="\c"
fi
ECHO="/bin/echo ${EFLAG}"
# example use:
#       ${ECHO} "some message: ${ENDER}"


# which MAILER do I need to use?
if [[ -f /usr/bin/mailx ]]
then
        set_MAILER=/usr/bin/mailx
elif [[ -f /usr/ucb/mail ]]
then
        set_MAILER=/usr/ucb/mail
else
        set_MAILER=mail
fi

# set the pager
if [ $PAGER ]
then
  : #preserve user's idea of a pager
else # use our idea
  if [[ -x /usr/bin/less ]]
  then
    export PAGER=/usr/bin/less
  elif [[ -x /usr/local/bin/less ]]
  then
    export PAGER=/usr/local/bin/less
  else
    export PAGER=more
  fi
fi



if [ $EDITOR ]
then
  if [[ $EDITOR != 'vi' ]]
  then
    :
  fi
else
  EDITOR=vi
fi

set_USER=$(whoami)
set_TRUEUSER=$(logname)

# if $set_TRUEUSER != $set_USER, user SU'd

# The time
set_HOUR=$(date +%H)
set_MINUTE=$(date +%M)
set_YEAR=$(date | awk '{print $NF}')
set_DAY=$(date +%d)
set_MONTH=$(date +%m)

set_HOSTS=$(cat /etc/hosts | egrep -v '^#|localhost' | awk '{print $2}' | cut -d. -f1 
| tr '\r' ' ')

####################################
# all the functions

# pushd, popd, dirs functions
set_DIRSTACK=""
export set_DIRSTACK

function dirs {
  print "$set_DIRSTACK"
}

function pushd {
  dirname=$1
  set_DIRSTACK="$dirname ${set_DIRSTACK:-$PWD}"
  cd ${dirname:?"missing directory name"}
  dirs
}

function popd {
  set_DIRSTACK=${set_DIRSTACK#* }
  cd ${set_DIRSTACK%% *}
  print "$PWD"
}

# do a df in k, not half k
set_DF () {
  case $set_SYSTEM in
    HP-UX)
      bdf $@
      ;;
    SunOS)
      case $set_SYSREV in
        5*)
          df -k $@
          ;;
        4*)
          df $@
          ;;
      esac
  esac
}

# do df of the local file systems
set_DFL () {
  case $set_SYSTEM in
    HP-UX)
      bdf -t hfs
      ;;
    SunOS)
      case $set_SYSREV in
        5*)
          df -kl | egrep -v ^mvfs\|^/proc\|^fd
          ;;
        4*)
          df | egrep ^/dev\|File\|^swap
          ;;
      esac
  esac
}

# ps | grep
set_psg () {
  ps $ps_cmd | egrep $1
}

set_psk () {
  ps $ps_cmd | egrep $1 | egrep -v grep | awk '{print $2}' | xargs kill
}

set_psk9 () {
  ps $ps_cmd | egrep $1 | egrep -v grep | awk '{print $2}' | xargs kill -9
}

-------
Tom Buskey

Reply via email to