ファイルに行番号を付けて出力する

スクリプト名: linenum.sh
書式: linenum.sh ファイル名
目的: ファイルに行番号を付けて出力する
戻り値: 成功:0 エラー:9

#!/bin/sh
export LANG=C LC_ALL=C
_FILE=$1.count
_LINE_NUM=1 
_IFS_ORIG=$IFS

[ -f "$1" -a -r "$1" ] || exit 9
#バックスラッシュをエスケープ文字と認識させないためにエスケープする
sed 's#\\#\\\\#g' $1 > $_FILE || exit 9
#最終行の行番号の桁数を求める
_MAX=$(( $(wc -l "$_FILE" | awk '{print $1}' | wc -c | awk '{print $1}') - 1 ))
IFS=

while read _LINE_DATA; do
    IFS="$_IFS_ORG"
    #現在の行番号の桁数を求める
    _FIG=$(( $(echo $_LINE_NUM | wc -c) -1 ))

    #行番号の桁数が変わっていなければスルー
    if [ "$_FIG_OLD" != "$_FIG" ]; then
        _ZERO=
        _ZERO_FIG=1
        #最大行番号の桁数に合うまで0の個数を増やす
        while [ $_ZERO_FIG -le $(( $_MAX - $_FIG )) ]; do
            _ZERO="0$_ZERO"
            _ZERO_FIG=$(( _ZERO_FIG + 1 ))
        done
    fi  

    echo "$_ZERO$_LINE_NUM: $_LINE_DATA"
    
    #次行の処理の用意
    _LINE_NUM=$(( _LINE_NUM + 1 ))
    _FIG_OLD=$_FIG
    IFS=
done < $_FILE

rm -f $_FILE