Вот кусок из конкретного скрипта подготовки данных для табеля рабочего времени.
Он построчно читает файл графика работы и преобразовывает его в три массива - начало,
конец и продолжительность рабочего дня.
Прошу не обращать внимание на бессмысленность последнего выода (3) - это только для примера.#!/bin/bash
# Create grafic.csv. Only for example script!
cat << ! > grafic.csv.example
date,date,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
user,ivanov,10:00-20:00,09:30-22:30,11:00-19:00,11:30-18:30,12:00-18:00,12:30-17:30,13:00-17:00,13:30-16:30,14:00-16:00,14:30-15:30,15:00-15:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00
user,petrov,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00
user,sidorov,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00,10:00-20:00
!
exec 2>$0.err
set -x
declare -a GRAFIC_TIMES
declare -a GRAFIC_TIMES_BEGIN
declare -a GRAFIC_TIMES_END
declare -a GRAFIC_TIMES_DELTA
############################################################################
function convert-time-human-unix() # 23:59 -> 12345
{
DATE=`echo $1 | tr ':,.' ':'`
MINUTES=`echo $DATE | cut -d : -f 2`
HOUERS=`echo $DATE | cut -d : -f 1`
#awk "BEGIN {print $SECONDS+$MINUTES*60+$HOUERS*3600}"
awk "BEGIN {print $MINUTES*60+$HOUERS*3600}"
}
############################################################################
function convert-time-unix-human() # 12345 -> 23:59
{
DATA=$1
let HOUERS=$DATA/3600
if [ $HOUERS -lt 10 ]
then
HOUERS=0$HOUERS
fi
DATA=`awk "BEGIN {print $DATA-$HOUERS*3600}"`
let MINUTES=$DATA/60
if [ $MINUTES -lt 10 ]
then
MINUTES=0$MINUTES
fi
echo "$HOUERS:$MINUTES"
}
###############################################################################
#
# BEGIN
#
GRAFIC_MONTH=05
GRAFIC_YEAR=2006
###############################################################################
#For every user
grep -e "^user," grafic.csv.example |
while read ROW
do
OLD_IFS=$IFS
IFS=","
set $ROW
IFS=$OLD_IFS
USERNAME=$2
shift 1
GRAFIC_TIMES=($@)
### GRAFIC_TIMES=ivanov 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00 10:00-20:00
let CNT=1
while [ $CNT != ${#GRAFIC_TIMES[@]} ]
do
if [ $CNT -lt 10 ]
then
DAY=0$CNT
else
DAY=$CNT
fi
GRAFIC_TIME=${GRAFIC_TIMES[$CNT]}
OLD_IFS=$IFS
IFS="-"
set $GRAFIC_TIME
IFS=$OLD_IFS
GRAFIC_TIME_BEGIN=$1
GRAFIC_TIME_END=$2
GRAFIC_TIME_BEGIN_SEC=`convert-time-human-unix $GRAFIC_TIME_BEGIN`
GRAFIC_TIME_END_SEC=`convert-time-human-unix $GRAFIC_TIME_END`
let GRAFIC_TIME_DELTA_SEC=$GRAFIC_TIME_END_SEC-$GRAFIC_TIME_BEGIN_SEC
GRAFIC_TIME_DELTA=`convert-time-unix-human $GRAFIC_TIME_DELTA_SEC`
GRAFIC_TIMES_BEGIN[$CNT]=$GRAFIC_TIME_BEGIN
GRAFIC_TIMES_END[$CNT]=$GRAFIC_TIME_END
GRAFIC_TIMES_DELTA[$CNT]=$GRAFIC_TIME_DELTA
let CNT=$CNT+1
echo ${GRAFIC_TIMES_BEGIN[@]} > 1.out # (1)
echo ${GRAFIC_TIMES_END[@]} >> 1.out
echo ${GRAFIC_TIMES_DELTA[@]} >> 1.out
done
echo ${GRAFIC_TIMES_BEGIN[@]} > 2.out # (2)
echo ${GRAFIC_TIMES_END[@]} >> 2.out
echo ${GRAFIC_TIMES_DELTA[@]} >> 2.out
done
echo ${GRAFIC_TIMES_BEGIN[@]} > 3.out # (3)
echo ${GRAFIC_TIMES_END[@]} >> 3.out
echo ${GRAFIC_TIMES_DELTA[@]} >> 3.out
echo $SECONDS
Конец.
Так вот, вывод (1) содержит данные, (2) тоже, а вывод (3) пуст....