Een organisatie laat haar leden zelf een gebruikersnaam kiezen. Om wildgroei van onzinnige gebruikersnamen tegen te gaan, legt de organisatie wel volgende beperkingen op:
De gebruikers van de organisatie hebben er echter een sport van gemaakt om op zoek te gaan naar bestaande woorden die zo lang mogelijk zijn, en die toch aan de opgelegde beperkingen voldoen. Als je naam Danny Kyung of Matthew Emes is, dan bieden deze regels immers alsnog de mogelijkheid om gebruikersnamen zoals dank1 (Danny Kyung) of memes2 (Matthey Emes) te rechtvaardigen.
Voortaan kunnen we dus ook spreken van Donald “Donut” Knuth (Donald Knuth) en Richard “Catalan” Stallman (Richard Stallman).
Schrijf een bash
shell script gebruikersnamen
waaraan één of twee argumenten moeten doorgegeven worden. Het eerst argument moet de naam van een persoon zijn, die uit meerdere woorden mag bestaan (bijvoorbeeld Donald Knuth
). Als tweede argument kan de locatie van een tekstbestand aan het shell script doorgegeven worden. Dit tekstbestand moet een reeks woorden bevatten, die elk op een afzonderlijke regel staan. Indien er geen tweede argument aan het shell script wordt doorgegeven, dan moet het script de lijst van woorden inlezen uit standaard invoer.
Het shell script moet de alfabetisch gesorteerde lijst van woorden uit het gegeven bestand (tweede argument) die geldige gebruikersnamen zijn voor een persoon met de gegeven naam (eerste argument) uitschrijven naar standaard uitvoer. Woorden zijn geldige gebruikersnamen als ze voldoen aan de twee voorwaarden die door de organisatie uit de inleiding opgelegd worden. Hierbij moet onderscheid gemaakt worden tussen hoofdletters en kleine letters (case sensitive).
Bovendien moet het shell script ook de volgende drie opties ondersteunen:
optie -i
: indien deze optie gebruikt wordt, dan mag bij het bepalen van de gebruikersnamen geen onderscheid gemaakt worden tussen hoofdletters en kleine letters (case insensitive)
optie -m
: met deze optie moet verplicht een natuurlijk getal als argument doorgegeven worden, dat de minimale lengte van de gebruikersnamen aangeeft die door het shell script moeten uitgeschreven worden; indien deze optie niet gebruikt wordt, dan wordt er geen minimale lengte opgelegd aan de gebruikersnamen die door het shell script moeten uitgeschreven worden
optie -M
: met deze optie moet verplicht een natuurlijk getal als argument doorgegeven worden, dat de maximale lengte van de gebruikersnamen aangeeft die door het shell script moeten uitgeschreven worden; indien deze optie niet gebruikt wordt, dan wordt er geen maximale lengte opgelegd aan de gebruikersnamen die door het shell script moeten uitgeschreven worden
Het shell script moet de volgende foutafhandeling voorzien:
indien het shell script niet de gepaste opties meekrijgt (enkel ondersteuning voor de opties -i
, -m
en -M
waarbij de laatste twee met een verplicht argument dat een natuurlijk getal is) dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) naar standaard error uitgeschreven worden, en moet het shell script eindigen met exit status 1
indien er niet één of twee argumenten aan het shell script worden doorgegegeven dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) naar standaard error uitgeschreven worden, en moet het shell script eindigen met exit status 1
indien er een tweede argument aan het shell script wordt doorgegeven dat geen bestaand gewoon bestand is dat kan gelezen worden, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) naar standaard error uitgeschreven worden, en moet het shell script eindigen met exit status 2
indien het shell script in het gegeven bestand geen geldige gebruikersnamen gevonden heeft die voldoen aan de opgelegde criteria, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) naar standaard error uitgeschreven worden, en moet het shell script eindigen met exit status 3
Onderstaande voorbeeldsessie geeft aan hoe het shell script gebruikersnamen
moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat het tekstbestand words.txt
3 zich in de huidige directory bevindt.
$ gebruikersnamen -m4
Syntaxis: gebruikersnamen naam -i -m <int> -M <int> [woordenlijst]
$ echo $?
1
$ gebruikersnamen -M2 "Alan Turing" unknown
gebruikersnamen: bestand "unknown" bestaat niet of is onleesbaar
$ echo $?
2
$ gebruikersnamen -m4 "Donald Knuth" words.txt
oath
$ echo $?
0
$ gebruikersnamen -im4 "Donald Knuth" < words.txt
daut
doat
dolt
dona
donut
doth
oath
$ gebruikersnamen -M2 "Donald Knuth" words.txt
ad
ah
al
an
at
na
nu
od
oh
on
uh
ut
$ gebruikersnamen -m6 John von Neumann < words.txt
Syntaxis: gebruikersnamen naam -i -m <int> -M <int> [woordenlijst]
$ echo $?
1
$ gebruikersnamen -m5 -M6 "John von Neumann" < words.txt
honan
human
nonman
$ gebruikersnamen -m6 "Emmy Noether" < words.txt
mother
$ gebruikersnamen -m6 "Linus Torvalds" words.txt
gebruikersnamen: geen gebruikersnamen gevonden voor "Linus Torvalds"
$ echo $?
3