# Incapsulating Functions

**URL:** <https://community.unix.com/t/incapsulating-functions/278152>\
**Category:** Shell Programming and Scripting\
**Created:** [November 29, 2010, 9:47am UTC](https://community.unix.com/t/incapsulating-functions/278152 "2010-11-29T09:47:58Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Richardox](https://community.unix.com/letter_avatar/richardox/32/5_5575768a8748004e209b776fc1b2916d.png) [@Richardox](https://community.unix.com/u/Richardox)\
**Post date:** [November 29, 2010, 9:47am UTC](https://community.unix.com/t/incapsulating-functions/278152/1 "2010-11-29T09:47:58Z")

</div>

Hello together,

I want to add 2 additional functions to a major function (format\_work()).

The format\_work() is calling two functions (check\_file() & split\_file()).

How should it look like, when both subfunctions are incapsulated?

```nohighlight
format_work() {
    echo "Start of COM_WORK formatting" >> ${LOG}
    i=0
    while [$i -lt $NB_SFI_IPN_ARRAY]
    do
        FILE_NAME=$COM_WORK/${FILE_SFI_IPN_ARRAY[$i]}.$EXT_SFI_IPN
        # echo FILE_NAME is $FILE_NAME
        check_file $FILE_NAME
        if [$? -eq 0]; then
            split_file $FILE_NAME ${FILE_SFI_IPN_ARRAY[$i]} $EXT_SFI_IPN
            rm -f $FILE_NAME 2> /dev/null
        else
            echo "No change for $FILE_NAME" >> ${LOG}
        fi
        i=$i+1
    done
    i=0
    while [$i -lt $NB_SFI_OSMS_ARRAY]
    do
        FILE_NAME_S=$COM_WORK/${FILE_SFI_OSMS_ARRAY[$i]}.$EXT_SFI_OSMS
        FILE_NAME_T=$COM_WORK/${FILE_SFI_OSMS_ARRAY[$i]}$TODAY.$EXT_SFI_OSMS
        # echo FILE_NAME is $FILE_NAME
        mv $FILE_NAME_S $FILE_NAME_T 2> /dev/null
        if [$? -ne 0]; then
            echo "Renaming of $FILE_NAME_T not successful" >> ${LOG}
        else
            echo "Renaming of $FILE_NAME_T successful" >> ${LOG}
        fi
        i=$i+1
    done
    echo "End of COM_WORK formatting\n" >> ${LOG}
    return 0
}
#-----------------------------------------------------------------------
check_file() {
    # set -x
     
    if [$# -ne 1]; then
        RC=1
        echo "Bad arguments, expected 1, received ${#}" >> ${LOG}
        return $RC
    fi
    # measure number of lines in file
    RECEIVED_NUMBER_OF_LINES=`wc -l $1 | awk '{print $1}'` 2> /dev/null
    # echo RECEIVED_NUMBER_OF_LINES $RECEIVED_NUMBER_OF_LINES
    if [$? -ne 0]; then
        echo "Measuring number of lines in EOT file not successful" >> ${LOG}
        return 1
    fi
    # echo check_file $1
    if ["$RECEIVED_NUMBER_OF_LINES" -gt $MAX_LINE]; then
        return 0
    else
        return 1
    fi
}
#-----------------------------------------------------------------------
split_file()
{
    if [$# -ne 3]; then
        RC=1
        echo "Bad arguments, expected 1, received ${#}" >> ${LOG}
        return $RC
    fi
    split -l $MAX_LINE -a 1 $1
    if [$? -ne 0]; then
        echo "Split of file $1 not successful" >> ${LOG}
        return 1
    fi 
    ls x? > dirlist1
    NB_OF_SPLIT_FILES=`wc -l dirlist1 | awk '{print $1}'` 2> /dev/null
    # echo NB_OF_SPLIT_FILES $NB_OF_SPLIT_FILES
    j=0
    while [$j -lt $NB_OF_SPLIT_FILES]
    do
        INC=${SERNO_ARRAY[$j]}
        FILE_OLD=${XX_ARRAY[$j]}
        FILE_NEW=${2}$INC.$3
        # echo $FILE_OLD
        # echo $FILE_NEW
        mv $FILE_OLD $COM_WORK/$FILE_NEW
        j=$j+1
    done
    echo "Splitting of $1 into $NB_OF_SPLIT_FILES" >> ${LOG}
    return 0
}

```

---

<div class="post-metadata">

**Author:** ![ctsgnb](https://community.unix.com/letter_avatar/ctsgnb/32/5_5575768a8748004e209b776fc1b2916d.png) [@ctsgnb](https://community.unix.com/u/ctsgnb)\
**Post date:** [November 29, 2010, 3:52pm UTC](https://community.unix.com/t/incapsulating-functions/278152/2 "2010-11-29T15:52:21Z")

</div>

I think function must be declared before being called (the order they are declared matter)  
check\_file and split\_file may have to be declared before format\_work

Double quote the variable that are passed as argument to a function you call (or use `eval` ) to avoir interpreting issue.

by the way,if you managed return code correctly in your functions,

a statements like

```plaintext
check_file "$WHATEVER"
if [$? -eq 0]; then
    echo ok
else 
    echo ko
fi

```

could be written smthg like (or with a ! )

```plaintext
if ( check_file $WHATEVER >/dev/null ) ; then
    echo ok
else 
    echo ko
fi

```

Corona would give you a "[useless use of test award](http://partmaps.org/era/unix/award.html)" for that 😉

---

<div class="post-metadata">

**Author:** ![Corona688](https://community.unix.com/letter_avatar/corona688/32/5_5575768a8748004e209b776fc1b2916d.png) [@Corona688](https://community.unix.com/u/Corona688)\
**Post date:** [November 29, 2010, 4:26pm UTC](https://community.unix.com/t/incapsulating-functions/278152/3 "2010-11-29T16:26:43Z")

</div>

Really that's not so bad a construct. It doesn't mean inevitable waste the way UUOC does.

I might boil it down into `check_file $FILENAME || echo "ko"` though. One line instead of five. 🙂
