Hoe een selectiemenu te maken met behulp van de select-instructie in de Bash-shell

  • Giles Benson
  • 0
  • 3734
  • 1132
>

We gebruiken allemaal heel vaak bash-scripts om saaie en repetitieve taken te automatiseren. Soms moeten we in onze scripts de gebruiker vragen om een ​​of meer keuzes interactief uit te voeren: in deze tutorial zullen we zien hoe we de Bash shell select-instructie kunnen gebruiken om een ​​dergelijke bewerking in zeer weinig regels code uit te voeren.

In deze tutorial leer je:
  • Hoe de Bash select-instructie te gebruiken
  • Hoe u de prompt voor het menu selecteren kunt aanpassen
Hoe een selectiemenu te maken met behulp van de select-instructie in de Bash-shell

Gebruikte softwarevereisten en -conventies

Softwarevereisten en Linux Command Line-conventies
Categorie Vereisten, conventies of gebruikte softwareversie
Systeem Distributie-onafhankelijk
Software De Bash-schaal
Andere geen speciale benodigdheden
Conventies # - vereist dat gegeven linux-commando's worden uitgevoerd met root-privileges, hetzij direct als rootgebruiker, hetzij door gebruik van sudo opdracht
$ - vereist dat gegeven linux-commando's worden uitgevoerd als een gewone niet-geprivilegieerde gebruiker

De selecte verklaring

Scripting is een van de meest voorkomende vaardigheden die een systeembeheerder moet bezitten om repetitieve taken te automatiseren en ze minder foutgevoelig te maken. In niet al te complexe gevallen is de schaal het perfecte hulpmiddel om voor de klus te gebruiken. Bash, de Bourne Again Shell, is de meest gebruikte shell in de GNU / Linux-wereld. Deze shell biedt het zeer nuttige selecteer uitspraak. Het doel ervan wordt op de volgende manier beschreven:

Selecteer woorden uit een lijst en voer opdrachten uit

De beschrijving is vrij duidelijk. De verklaring stelt ons in staat om interactief input van een gebruiker te ontvangen, een genummerde lijst met keuzes te genereren en hem te vragen er een te selecteren. Laten we eens kijken hoe het wordt gebruikt:

selecteer NAAM [in WOORDEN…;] doe COMMANDO'S; gedaan

De syntaxis lijkt sterk op die van een traditioneel for loop in Bash, behalve het gebruik van de selecteer trefwoord. Het select-statement werkt echter op een andere manier. Laten we een voorbeeld bekijken. Stel dat we een gebruiker willen vragen om een ​​van de bestanden in een directory te selecteren. Hier is wat we zouden kunnen schrijven:

$ files = "$ (ls -A.)" $ selecteer bestandsnaam in $ files; echo "$ file"; gedaan 1) bestand1 2) bestand2 3) bestand3 #? 

Laten we uitleggen wat we hebben gedaan. Allereerst hebben we een lijst verkregen van alle bestanden die aanwezig zijn in de directory (in dit geval de huidige werkdirectory) met behulp van de ls commando en specificeer het -EEN optie (afkorting voor --bijna alle), om het geïmpliceerde uit te sluiten  . en ... uit de geretourneerde lijst, die we hebben toegewezen aan de bestanden variabele.

We gingen toen verder met het gebruik van de selecteer uitspraak. Het bovenstaande is een heel eenvoudig voorbeeld: we hebben het resultaat van de uitbreiding van het het dossier variabele als de lijst met op te nemen keuzes. Merk op dat we de uitbreiding hebben vermeden $ bestanden met opzet, om te verkrijgen woord splitsen: wanneer een uitbreiding wordt geciteerd met dubbele aanhalingstekens woord splitsen wordt onderdrukt, dus spaties worden niet gebruikt als scheidingstekens voor woorden en het resultaat van de uitbreiding wordt als een geheel beschouwd. Dit is in dit geval niet wat we willen: we hebben elk woord nodig als keuze in het gegenereerde menu.



De woorden die zijn verkregen door de uitbreiding van de variabele worden afgedrukt op de stderr (standaardfout). Elk nummer wordt voorafgegaan en geassocieerd met een nummer, dat de gebruiker zal gebruiken om ernaar te verwijzen. Nadat alle elementen zijn weergegeven, wordt de gebruiker gevraagd zijn keuze in te voeren. Wat wordt weergegeven is het PS3 prompt, die standaard is ingesteld op #?.

Wat gebeurt er als de gebruiker een selectie uitvoert? Laten we zien:

$ files = "$ (ls -A.)" $ selecteer bestandsnaam in $ files; echo "Je hebt $ filename" geselecteerd; gedaan 1) bestand1 2) bestand2 3) bestand3 #? 1 Je hebt bestand 1 # geselecteerd? 

De keuze die we hebben ingevoerd, 1, wordt gelezen uit de stdin (standaardinvoer) en als het ingevoerde nummer een van de beschikbare is, wordt het overeenkomstige woord ("bestand1" in het voorbeeld) toegewezen aan de,bestandsnaam variabele. In ons voorbeeld hebben we gespecificeerd echo "$ filename" als de opdracht die moet worden uitgevoerd zodra de keuze is uitgevoerd: als resultaat: het geselecteerde woord wordt op het scherm afgedrukt. Het nummer dat we invoeren om onze keuze te specificeren, wordt ook opgeslagen in een variabele:  ANTWOORD.

U merkt misschien dat er iets vreemds gebeurde in het bovenstaande voorbeeld: toen we onze keuze eenmaal hadden uitgevoerd, na de uitvoering van het commando, werd ons opnieuw om een ​​keuze gevraagd, waarom? Dit gebeurde omdat we geen breken opdracht. We kunnen dit eenvoudig oplossen:

$ files = "$ (ls -A.)" $ selecteer bestandsnaam in $ files; echo "Je hebt $ filename" geselecteerd; breken; gedaan 1) bestand1 2) bestand2 3) bestand3 #? 1 U hebt file1 geselecteerd

Wat als we geen selectie bieden? De prompt wordt gewoon herhaald totdat we het volgende doen:

selecteer bestandsnaam in $ files; echo "Je hebt $ filename" geselecteerd; breken; gedaan 1) bestand1 2) bestand2 3) bestand3 #? 1) bestand1 2) bestand2 3) bestand3 #? 

Wat als we een nummer invoeren dat niet in de lijst staat? In dit geval is de variabele die we gebruiken, in ons geval bestandsnaam, ingesteld op nul.

De selectievraag wijzigen

Zoals we al hebben gezien, is de prompt die door de shell wordt gebruikt in de context van een select-statement de PS3 prompt, die standaard de #? string heeft een waarde. Dit is niet erg gebruiksvriendelijk, dus we willen het misschien veranderen en in plaats daarvan iets meer beschrijvend gebruiken. Hoe kunnen we dat doen? Heel eenvoudig: we moeten de waarde van de PS3 parameter:

$ PS3 = "Voer uw keuze in:"


De volgende keer zullen we de selecteer verklaring, zullen we de verandering opmerken:

selecteer bestandsnaam in $ files; echo "Je hebt $ filename $ REPLY geselecteerd"; breken; gedaan 1) bestand1 2) bestand2 3) bestand3 Voer uw keuze in: 

De wijziging die in de variabele is aangebracht, zal alleen van kracht zijn voor de huidige shell-sectie, en als we exporteren de variabele, ook in al zijn kinderen:

$ export PS3 = "Voer uw keuze in:"

De wijziging blijft echter tijdelijk totdat we de PS3 variabele binnen de .bashrc het dossier. PS3 is slechts een van de prompts die in Bash worden gebruikt: bekijk ons ​​bash-promptartikel als je meer over het onderwerp wilt weten.

Conclusies

In deze tutorial hebben we geleerd hoe we de Bash moeten gebruiken selecteer uitspraak. We hebben gezien hoe het werkt en hoe we het kunnen gebruiken om een ​​selectiemenu te maken om interactief een gebruiker te vragen een keuze uit te voeren. Ten slotte hebben we gezien hoe we de prompt die in het selectiemenu wordt weergegeven, kunnen aanpassen door de shell te wijzigen PS3 parameter.




Niemand heeft nog op dit artikel gereageerd.

Een verzameling nuttige informatie over het Linux-besturingssysteem en nieuwe technologieën
Nieuwe artikelen, praktische tips, gedetailleerde recensies en handleidingen. Voel je thuis in de wereld van het Linux-besturingssysteem