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 …
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:
optie -a: schrijf tussen de ronde haakjes
(vóór de verjaardag en ervan gescheiden door een komma en
een spatie) ook de leeftijd $$n$$ op de volgende verjaardag uit in het
formaat age n
optie -c <int>: schrijf alle personen uit die de komende <int> dagen jarig zijn; dit is tot en met <int> dagen na vandaag en inclusief vandaag; standaard worden alle personen uitgeschreven die de komende 7 dagen jarig zijn
optie -d <file>: gebruik de personen en hun geboortedatums uit het bestand op locatie <file>; standaard maakt het script gebruik van het bestand ~/.birthdays
optie -h: verjaardagen die vandaag vallen worden uitgeschreven als today, verjaardagen die morgen vallen als tomorrow, en verjaardagen die over $$n > 1$$ dagen vallen als in n days; standaard worden verjaardagen uitgeschreven in het formaat jaar/maand/dag (zoals ze in het bestand voorkomen)
optie -s: sorteer de personen volgens toenemend aantal dagen tot de volgende verjaardag; standaard worden de personen uitgeschreven in de volgorde waarin ze in het bestand voorkomen
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 het script niet de gepaste opties meekrijgt (enkel ondersteuning voor de hierboven opgelijste opties) dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het script eindigen met exit status 1
als het bestand niet gevonden wordt op de aangegeven locatie (of de standaardlocatie indien er niet expliciet een locatie wordt aangegeven) of daar niet kan uitgelezen worden, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het script eindigen met exit status 2
Als er zich geen fouten voordoen dan moet het script eindigen met exit status 0.
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
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
Wereldwijd zijn er het meest mensen geboren op 5 oktober.
Dat is exact negen maanden na oudejaarsavond. Hmm.