Je legt een bestand aan met geboortedatums van jouw vrienden, zodat je makkelijker hun verjaardagen en leeftijden kan onthouden. Elke regel van het bestand bevat de volgende vier informatievelden die van elkaar gescheiden worden door spaties: i) geboortejaar, ii) geboortemaand, iii) geboortedag en iv) naam. Het veld met de naam mag zelf ook spaties bevatten. Het bestand zou er bijvoorbeeld als volgt kunnen uitzien:

1912 6 23 Alan Turing
1955 6 8 Tim Berners-Lee
1938 1 10 Donald Knuth
1973 8 12 Sergey Brin
1973 3 26 Larry Page
1943 2 4 Ken Thompson
1906 12 9 Grace Hopper
…

Opgave

Schrijf een bash shell script birthdays dat een overzicht uitschrijft naar stdout van je vrienden die de komende periode jarig zijn. Elke regel van het overzicht bestaat uit de naam van een persoon, een spatie en tussen ronde haakjes wanneer de persoon de volgende keer jarig is. Hiervoor baseert het script zich op een bestand waarvan de inhoud in de inleiding werd beschreven.

Het script moet de volgende opties ondersteunen:

Het script moet bij de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen eventueel samengenomen worden, …. Daarnaast moet het script ook de volgende foutafhandeling voorzien:

Als er zich geen fouten voordoen dan moet het script eindigen met exit status 0.

Tip

Om het verschil tussen twee datums te bepalen, kan je de datums omzetten naar Unix-tijd1 (aantal seconden sinds een referentietijdstip, meestal 1 januari 1970 om 00:00:00 UTC2):

$ date -d "19 aug 2019" "+%s"
1566165600

Voorbeeld

Onderstaande voorbeeldsessie geeft aan hoe het bash shell script birthdays moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat het tekstbestand .birthdays3 zich in je home directory bevindt en dat het tekstbestand scientists.txt4 zich in de huidige directory bevindt. Het voorbeeld gaat er ook van uit dat het bestand unknown niet bestaat (of niet leesbaar is).

$ date
Mon Aug 19 15:22:54 DST 2019
$ birthdays
Sergey Brin (21/8/2019)
Masatoshi Shima (22/8/2019)
Jeff Rulifson (20/8/2019)
Edgar F. Codd (19/8/2019)
$ birthdays -c 30
Sergey Brin (21/8/2019)
Dennis Ritchie (9/9/2019)
Masatoshi Shima (22/8/2019)
John McCarthy (4/9/2019)
Jeff Rulifson (20/8/2019)
Edgar F. Codd (19/8/2019)
$ birthdays -c30 -a
Sergey Brin (age 46, 21/8/2019)
Dennis Ritchie (age 78, 9/9/2019)
Masatoshi Shima (age 76, 22/8/2019)
John McCarthy (age 93, 4/9/2019)
Jeff Rulifson (age 78, 20/8/2019)
Edgar F. Codd (age 96, 19/8/2019)
$ birthdays -c30 -ah
Sergey Brin (age 46, in 2 days)
Dennis Ritchie (age 78, in 21 days)
Masatoshi Shima (age 76, in 3 days)
John McCarthy (age 93, in 16 days)
Jeff Rulifson (age 78, tomorrow)
Edgar F. Codd (age 96, today)
$ birthdays -c30 -ahs
Edgar F. Codd (age 96, today)
Jeff Rulifson (age 78, tomorrow)
Sergey Brin (age 46, in 2 days)
Masatoshi Shima (age 76, in 3 days)
John McCarthy (age 93, in 16 days)
Dennis Ritchie (age 78, in 21 days)
$ birthdays -a -c 14 -d scientists.txt5 -h -s
Antoine-Laurent de Lavoisier (age 276, in 7 days)
Ernest Rutherford, 1st Baron Rutherford of Nelson (age 148, in 11 days)
$ birthdays -x
birthdays [-ahs] [-c <int>] [-d <file>]
$ echo $?
1
$ birthdays -d
birthdays [-ahs] [-c <int>] [-d <file>]
$ echo $?
1
$ birthdays -d unknown
birthdays: cannot access database 'unknown'
$ echo $?
2

Epiloog

Wereldwijd zijn er het meest mensen geboren op 5 oktober.

Dat is exact negen maanden na oudejaarsavond. Hmm.