The following script provides several examples of using "discipline" funtions within Korn Shell 93.


#!/usr/bin/ksh93
################################################################
# A discipline function is a function that is associated with a specific
# variable. This allows you to define and call a function every time that
# variable is referenced, set, or unset. These functions take the form of
# varname.function, where varname is the name of the variable and function
# is the discipline function. The predefined discipline functions are get,
# set, and unset.
# 
#     * The varname.get function is invoked every time varname is
#     referenced. If the special variable .sh.value is set within this
#     function, then the value of varname is changed to this value. 
#     A simple example is the time of day:
# 
# $ function time.get 
# > { 
# >     .sh.value=$(date +%r) 
# > } 
# $ print $time 
# 09:15:58 AM 
# $ print $time    # it will change in a few seconds 
# 09:16:04 AM
# 
#     * The varname.set function is invoked every time varname is set. The
#     .sh.value variable is given the value that was assigned. The value
#     assigned to varname is the value of .sh.value when the function
#     completes. For example:
# 
# $ function adder.set 
# > { 
# >   let .sh.value="
# $ {.sh.value} + 1" 
# > } 
# $ adder=0 
# $ echo $adder 
# 1 
# $ adder=$adder 
# $ echo $adder 
# 2  
# 
#     * The varname.unset function is executed every time varname is
#     unset. The variable is not actually unset unless it is unset 
#     within the function itself; otherwise it retains its value.
# 
# Within all discipline functions, the special variable .sh.name is set to
# the name of the variable, while .sh.subscript is set to the value of the
# variables subscript, if applicable.
# 
# Compound variables are supported. A compound variable allows a user to
# specify multiple values within a single variable name. The values are
# each assigned with a subscript variable, separated from the parent
# variable with a . (period). For example:
# 
# $ myvar=( x=1 y=2 ) 
# $ print "${myvar.x}" 
# 1
# 
################################################################
function DATETIME.get
{ 
  print "\ninside the DATETIME.get function"
    print ".sh.name=${.sh.name}"
    print ".sh.value=${.sh.value}"
    print ".sh.subscript=${.sh.subscript}"
    .sh.value=$( printf "%(%c)T\n" )
} 
################################################################
function DATETIME.set
{
  print "\ninside the DATETIME.set function"
    print ".sh.name=${.sh.name}"
    print ".sh.value=${.sh.value}"
    print ".sh.subscript=${.sh.subscript}"
}
################################################################
function DATETIME.unset
{
  print "\ninside the DATETIME.unset function"
    print ".sh.name=${.sh.name}"
    print ".sh.value=${.sh.value}"
    print ".sh.subscript=${.sh.subscript}"
}
################################################################

DATETIME="test"

print "${DATETIME}"

unset DATETIME