タブをスペースに置換する

#!/bin/sh
#tab2sp.sh [-s N] [filename...] N タブを変換するスペースの文字数

TABSTOP=8
MINTABSTOP=1
INFILE="-"
OPTIONS="s:"
LSPACES={}

#タブをスペースに変換する関数
function replace_tab(){
    local LLINE="$1"
    local LTMP1=""
    local LTMP2=""
    local LTMP3=""
    local LNLIN=""
    local LLENGTH=${#LLINE}
    local Llen1=0

    IFS=""

    while [ 0 -lt $LLENGTH ]; do
        Llen1=0
        LTMP3="$LLINE"
        LTMP2="${LTMP3#}"
        LTMP3="$LLINE"
        LTMP1="${LTMP3%${LTMP2}}"
        LLINE="$LTMP2"
        while [ "\t" != "${LTMP1}" ]; do
            LNLIN="$LNLIN$LTMP1"
            let "Llen1++"
            if [ 0 -eq ${#LTMP2} ]; then
                break
            fi
            LTMP3="$LLINE"
            LTMP2="${LTMP3#?}"
            LTMP3="$LLINE"
            LTMP1="${LTMP3%${LTMP2}}"
            LLINE="$LTMP2"
        done
        if [ " " = "${LTMP1}" ]; then
            i=$(( $TABSTOP - ( $Llen1 % $TABSTOP ) ))
            LNLIN="$LNLIN${LSPACES[$I]}"
        fi
        LLENGTH=${#LLINE}
    done
    echo "$LNLIN"
}

#オプションの処理
while getopts $OPTIONS opt $@ ; do
    case "$opt" in
        s)
            if [ $MINSTASTOP -le $OPTARG ]; then
                TABSTOP=$OPTARG
            else
                echo "タブストップの文字数を指定してください" 1>&2
                exit -1
            fi
            ;;
        *) exit -1 ;;
    esac
done

#指定ファイルの処理
shift $(( $OPTIND -1 ))
if [ $# -eq 0 ]; then
    INFILE=""
elif [ $# -eq 1 ]; then
    if [ "\-" = "$1" ]; then
        INFILE=""
    else
        INFILE="$1"
        if [ ! "(" -f $INFILE ")" ]; then
            echo "ファイルが読めません" 1>&2 
            exit -1
        fi
    fi
else
    echo "オプションが多いです" 1>&2
    exit -1
fi

#タブを置換するスペースの文字列を作成
LSPACES[1]=" "
for (( i = 2; i <= $TABSTOP; i++ )) {
    LSPACES[$i]="${LSPACES[$i-1]} "
}

#メイン処理
if [ "" = "$INFILE" ]; then
    echo 1 
    while read line; do
        replace_tab "$line"
    done
else
    while read line; do
        replace_tab "$line"
    done < "$INFILE"
fi