Monday 8 February 2016

]Bash / Gawk] How to print how long do you have to stay at work today ?

Today I'm going to show you a short script wirtten when I was running integration tests. It simply shows minutes you still have to be at work.
#!/bin/bash
START_HOUR=$1
START_MINUTE=$2

if [ -z "$START_HOUR" ] || [ -z "$START_MINUTE" ]; then
    START_HOUR="9"
    START_MINUTE="45"
fi

date | gawk '{print $4}' | gawk -F":" '{print 8 * 60 - (($1 * 60 + $2) - ('"$START_HOUR"' * 60 + '"$START_MINUTE"'))}'
It's actually very simple.
START_HOUR=$1
START_MINUTE=$2
Here I create two variables which contain hour and minute I came to the office.
[ -z "$START_HOUR" ]
This condition checks whether a variable contains some value. In case I don't pass the date when I came it sets my default which is 9:45. Then very simple oneliner:
date | gawk '{print $4}' | gawk -F":" '{print 8 * 60 - (($1 * 60 + $2) - ('"$START_HOUR"' * 60 + '"$START_MINUTE"'))}'
date
prints current date -> Mon 8 Feb 15:12:09 CET 2016
date | gawk '{print $4}'
prints the fourth field (split by whitespace) -> 15:12:55
gawk -F":"
-F allows you to specify how do you want the input string to be split - in this case it's ':' so $1 now contains current hour and $2 current minute.
'"$START_HOUR"'
this is how you can access shell variables in gawk And then some simple math (note that I assume that working day == 8h):
'{print 8 * 60 - (($1 * 60 + $2) - ('"$START_HOUR"' * 60 + '"$START_MINUTE"'))}'
8 * 60 = working day (minutes)
($1 * 60 + $2) - ('"$START_HOUR"' * 60 + '"$START_MINUTE"'))
current minute of day minus minute I came to the office
The result of the script is: 148 which means I can go home after 148 minutes :)
You can obviously pass what time you came to work:
./howLong 10 0 prints 162

No comments:

Post a Comment