################################################################ #### #### This Korn Shell 93 function generates a uniq UID number/value #### for a username, that username must consist of 3 letters #### followed by 4 digits, or 4 letters followed by 3 digits. The #### username is assumed to be the first argument to the function. #### The username must also be exactly 7 characters long. #### #### This function is dependent upon the external #### function "mkascii". #### ################################################################ function mkuid { typeset -l MKUID_LET typeset MKUID_NUMLET=0 MKUID_NUMLET="${1//([!a-zA-Z])/}" MKUID_NUMLET="${#MKUID_NUMLET}" if (( ${#1} != 7 )) then print -u 2 "ERROR: Number of characters in username ${1} is not equal to 7\n" return -1 fi if (( MKUID_NUMLET != 3 )) && (( MKUID_NUMLET != 4 )) then print -u 2 "ERROR: Number of letters in username ${1} is not equal to 3 or 4\n" return -1 fi (( MKUID_TYPE = 10 ** ( 7 - MKUID_NUMLET ) )) typeset MKUID_LOWLIM=1000000 (( MKUID_LOWUID = ( 26 ** ( MKUID_NUMLET - 1 ) * MKUID_LOWLIM / 100 ) + MKUID_LOWLIM )) (( MKUID_NUMLET == 3 )) && (( MKUID_LOWUID = MKUID_LOWLIM )) typeset MKUID_BASE=26 typeset MKUID_NVALUE="" typeset MKUID_LVALUE=0 typeset MKUID_ECNT=0 typeset MKUID_SUBTOT=0 typeset MKUID_TOT=0 typeset MKUID_MULT=0 typeset -A MKUID_LETTERS mkascii MKUID_LETTERS # print " ${MKUID_LETTERS[@]}" eval EACHLET="( ${1//(?)/ \1} )" for MKUID_LET in "${EACHLET[@]}" do if [[ "_${MKUID_LET}" = _[a-z] ]] then MKUID_LVALUE="$(( ${MKUID_LETTERS[${MKUID_LET}]} - 97 ))" else MKUID_LVALUE="0" MKUID_NVALUE="${MKUID_NVALUE}${MKUID_LET}" fi (( MKUID_MULT = MKUID_BASE ** MKUID_ECNT )) (( MKUID_SUBTOT = MKUID_SUBTOT + MKUID_LVALUE * MKUID_MULT )) (( MKUID_ECNT = MKUID_ECNT + 1 )) done (( MKUID_TOT = ( ( MKUID_SUBTOT * MKUID_TYPE ) + MKUID_NVALUE ) + MKUID_LOWUID )) print ${MKUID_TOT} return 0 }