Inleiding tot uitbreidingen van basishellparameters

  • Noah Scott
  • 0
  • 773
  • 36
>

Een shell is een cruciaal onderdeel van een op Unix gebaseerd besturingssysteem en is de belangrijkste interface die we kunnen gebruiken om met het systeem zelf te communiceren. Bash is zonder twijfel de meest gebruikte shell op de meeste Linux-distributies: het werd geboren als de gratis softwarevervanging voor de Bourne schelp (bash is het acroniem voor Bourne-again shell) binnen het GNU-project. In deze tutorial zullen we leren hoe enkele van de meest bruikbare bash-uitbreidingen werken.
Als je nog niet bekend bent met Bash, of als je gewoon je geheugen moet opfrissen, dan wordt je aangeraden om onze Bash Scripting Tutorial voor beginners te bezoeken, voordat je in het Bash Shell uitbreidingsconcept hieronder duikt.

In deze tutorial leer je:
  • Hoe verschillende bash-parameteruitbreidingen te gebruiken

Gebruikte softwarevereisten en -conventies

Softwarevereisten en Linux Command Line-conventies
Categorie Vereisten, conventies of gebruikte softwareversie
Systeem Distributie-onafhankelijk
Software Een Bash-schaal
Andere Basiskennis van Bash
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 eenvoudigst mogelijke uitbreiding

De eenvoudigst mogelijke syntaxis voor parameteruitbreiding is de volgende:

$ parameter

Wanneer we deze syntaxis gebruiken, parameter wordt vervangen door zijn waarde. Laten we een voorbeeld bekijken:

$ site = "linuxconfig.org" $ echo "$ site" linuxconfig.org

We hebben het site variabele en toegewezen de "linuxconfig.org" string eraan. We hebben toen de echo commando om het resultaat van de variabele uitbreiding weer te geven. Omdat dit een basisuitbreiding was, zou het zelfs hebben gewerkt zonder het gebruik van accolades rond de variabelenaam:

$ echo "$ site" linuxconfig.org

Waarom hebben we de accolades dan? Accolades worden bij het uitvoeren van parameteruitbreidingen gebruikt om de variabelenaam te begrenzen:

$ echo "U leest dit artikel op $ site_!" U leest dit artikel op

Wat is er gebeurd? Omdat de variabelenaam niet is gescheiden, is de _ karakter werd er als onderdeel van beschouwd. De schaal probeerde het niet-bestaande uit te breiden $ site_ variabele, daarom werd er niets geretourneerd. Het omwikkelen van de variabele met accolades lost dit probleem op:

$ echo "U leest dit artikel op $ site _!" U leest dit artikel op linuxconfig_!

Hoewel het gebruik van accolades niet altijd nodig is bij basisparameteruitbreiding, is het verplicht om alle andere uitbreidingen uit te voeren die we in dit artikel zullen zien.

Voordat ik verder ga, wil ik u een tip geven. In het bovenstaande voorbeeld probeerde de shell een niet-bestaande variabele uit te breiden, wat een blanco resultaat opleverde. Dit kan erg gevaarlijk zijn, vooral bij het werken met padnamen, daarom wordt het bij het schrijven van scripts altijd aangeraden om de zelfstandig naamwoord optie die ervoor zorgt dat de shell afsluit met een foutmelding wanneer naar een niet bestaande variabele wordt verwezen:

$ set -o nounset $ echo "U leest dit artikel op $ site_!" bash: site_: ongebonden variabele

Werken met indirectheid

Het gebruik van de $ ! parameter syntaxis, voegt een niveau van indirectheid toe aan onze parameteruitbreiding. Wat betekent het? De parameter die de shell zal proberen uit te breiden is dat niet parameter ; in plaats daarvan zal het proberen de waarde van te gebruiken parameter als de naam van de variabele die moet worden uitgebreid. Laten we dit met een voorbeeld uitleggen. We kennen allemaal de HUIS variabele wordt uitgevouwen in het pad van de basismap van de gebruiker in het systeem, rechts?

$ echo "$ HOME" / home / egdoc

Goed, als we nu de string "HOME" toewijzen aan een andere variabele, en dit type uitbreiding gebruiken, krijgen we:

$ variable_to_inspect = "HOME" $ echo "$ ! variable_to_inspect" / home / egdoc

Zoals je kunt zien in het bovenstaande voorbeeld, in plaats van "HOME" als resultaat te krijgen, zoals het zou zijn gebeurd als we een eenvoudige uitbreiding hadden uitgevoerd, gebruikte de shell de waarde van variable_to_inspect als de naam van de variabele die moet worden uitgebreid, daarom hebben we het over een niveau van indirectheid.

Case modificatie uitbreiding

Met deze syntaxis voor parameteruitbreiding kunnen we het hoofdlettergebruik van de alfabetische tekens binnen de tekenreeks wijzigen die het resultaat zijn van de uitbreiding van de parameter. Stel dat we een variabele hebben genaamd naam; om de tekst die wordt geretourneerd door de uitbreiding van de variabele te kapitaliseren, gebruiken we de $ parameter ^ syntaxis:

$ name = "egidio" $ echo "$ naam ^" Egidio

Wat als we de hele tekenreeks in hoofdletters willen zetten in plaats van deze met een hoofdletter te schrijven? Gemakkelijk! wij gebruiken de $ parameter ^^ syntaxis:

$ echo "$ naam ^^" EGIDIO

Om het eerste teken van een tekenreeks in kleine letters te plaatsen, gebruiken we de $ parameter, uitbreidingssyntaxis:

$ name = "EGIDIO" $ echo "$ naam," eGIDIO

Om de hele string in kleine letters te plaatsen, gebruiken we in plaats daarvan de $ parameter ,, syntaxis:

$ name = "EGIDIO" $ echo "$ naam ,," egidio

In alle gevallen a patroon om overeen te komen met een enkel teken kan ook worden opgegeven. Als het patroon wordt geleverd, wordt de bewerking alleen toegepast op de delen van de originele string die ermee overeenkomen:

$ name = "EGIDIO" $ echo "$ naam ,, [DIO]" EGidio


In het bovenstaande voorbeeld plaatsen we de tekens tussen vierkante haken: dit zorgt ervoor dat elk van hen als patroon wordt vergeleken.

Bij het gebruik van de uitbreidingen die we in deze paragraaf hebben uitgelegd en de parameter is een array waarop is geabonneerd @ of *, de bewerking wordt toegepast op alle elementen die het bevat:

$ my_array = (een twee drie) $ echo "$ my_array [@] ^^" EEN TWEE DRIE

Wanneer naar de index van een specifiek element in de array wordt verwezen, wordt de bewerking alleen daarop toegepast:

$ my_array = (een twee drie) $ echo "$ my_array [2] ^^" THREE

Verwijderen van substring

Met de volgende syntaxis die we zullen onderzoeken, kunnen we een patroon vanaf het begin of vanaf het einde van een string als gevolg van de uitbreiding van een parameter.

Verwijder het bijpassende patroon vanaf het begin van de string

De volgende syntaxis zullen we onderzoeken, $ parameter # patroon, stelt ons in staat om een patroon van de begin van de tekenreeks die resulteert uit de parameter uitbreiding:

$ name = "Egidio" $ echo "$ naam # Egi" dio

Een vergelijkbaar resultaat kan worden verkregen door de "$ parameter ## pattern" syntaxis, maar met één belangrijk verschil: in tegenstelling tot degene die we in het bovenstaande voorbeeld hebben gebruikt, wordt de kortste bijpassende patroon vanaf het begin van de tekenreeks wordt de het langst een. Het verschil is duidelijk zichtbaar bij gebruik van de * karakter in de patroon:

$ name = "Egidio Docile" $ echo "$ naam # * i" dio Docile

In het bovenstaande voorbeeld hebben we gebruikt * als onderdeel van het patroon dat uit de string moet worden verwijderd als gevolg van de uitbreiding van de naam variabele. Deze jokerteken komt overeen met elk teken, dus het patroon zelf vertaalt zich in "'i' teken en alles ervoor". Zoals we al zeiden, wanneer we de $ parameter # patroon syntaxis, wordt het kortste overeenkomende patroon verwijderd, in dit geval is het "Egi". Laten we eens kijken wat er gebeurt als we de "$ parameter ## pattern" syntaxis in plaats daarvan:

$ name = "Egidio Docile" $ echo "$ naam ## * i" bestand

Dit keer wordt het langste matchpatroon verwijderd ("Egidio Doci"): de langst mogelijke match bevat de derde 'i' en alles ervoor. Het resultaat van de uitbreiding is gewoon 'le'.

Verwijder het bijpassende patroon van het uiteinde van de string

De syntaxis die we hierboven hebben gezien, verwijdert het kortste of langste overeenkomende patroon vanaf het begin van de string. Als we willen dat het patroon wordt verwijderd uit het einde van de string, in plaats daarvan moeten we de $ parameter% patroon of $ parameter %% patroon uitbreidingen, om respectievelijk de kortste en langste overeenkomst van het einde van de string te verwijderen:

$ name = "Egidio Docile" $ echo "$ name% i *" Egidio Doc

In dit voorbeeld vertaalt het patroon dat we hebben opgegeven ruwweg in "'i' karakter en alles erna beginnend vanaf het einde van de string". De kortste match is "ile", dus wat wordt geretourneerd is "Egidio Doc". Als we hetzelfde voorbeeld proberen, maar we gebruiken de syntaxis die de langste overeenkomst verwijdert die we verkrijgen:

$ name = "Egidio Docile" $ echo "$ name %% i *" Bijv

In dit geval is de eenmaal de langste overeenkomst verwijderd, wat wordt geretourneerd is "bijv.".

In alle uitbreidingen die we hierboven hebben gezien, is if parameter is een array en het is geabonneerd met * of @, het verwijderen van het bijpassende patroon wordt toegepast op al zijn elementen:

$ my_array = (een twee drie) $ echo "$ my_array [@] # * o" ne drie 


Zoek en vervang patroon

We hebben de vorige syntaxis gebruikt om een ​​overeenkomend patroon van het begin of het einde van de tekenreeks te verwijderen als gevolg van de uitbreiding van een parameter. Wat als we willen vervangen  patroon met iets anders? We kunnen de $ parameter / patroon / string of $ parameter // patroon / string syntaxis. De eerste vervangt alleen de eerste keer dat het patroon voorkomt, de laatste vervangt alle keren dat het patroon voorkomt:

$ phrase = "geel is de zon en geel is de citroen" $ echo "$ phrase / yellow / red" rood is de zon en geel is de citroen

De parameter (zin) wordt uitgevouwen en de langste overeenkomst van de patroon (geel) wordt ermee vergeleken. De match wordt dan vervangen door het geleverde draad (rood). Zoals u kunt zien, wordt alleen het eerste exemplaar vervangen, dus de citroen blijft geel! Als we alle exemplaren van het patroon willen wijzigen, moeten we het voorvoegsel met de / karakter:

$ phrase = "geel is de zon en geel is de citroen" $ echo "$ phrase // yellow / red" rood is de zon en rood is de citroen

Dit keer zijn alle gevallen van "geel" vervangen door "rood". Zoals je kunt zien, komt het patroon overeen waar het zich ook bevindt in de string als gevolg van de uitbreiding van parameter. Als we willen specificeren dat het alleen aan het begin of aan het einde van de string moet worden gevonden, moeten we het respectievelijk voorvoegen met de # of % karakter.

Net als in de vorige gevallen, if parameter is een array waarop een van beide is geabonneerd * of @, de vervanging gebeurt in elk van de elementen:

$ my_array = (een twee drie) $ echo "$ my_array [@] / o / u" een twee drie

Substring-uitbreiding

De $ parameter: offset en $ parameter: offset: length Met uitbreidingen kunnen we slechts een deel van de parameter uitbreiden, waarbij een deelstring wordt geretourneerd die begint bij het opgegeven compensatie en lengte karakters lang. Als de lengte niet is gespecificeerd, gaat de uitbreiding door tot het einde van de originele string. Dit type uitbreiding wordt genoemd substring uitbreiding:

$ name = "Egidio Docile" $ echo "$ naam: 3" dio Docile

In het bovenstaande voorbeeld hebben we alleen de compensatie, zonder de lengte, daarom was het resultaat van de uitbreiding de deelstring die werd verkregen door te beginnen met het teken dat wordt gespecificeerd door de offset (3).

Als we een lengte specificeren, begint de subtekenreeks bij compensatie en zal zijn lengte karakters lang:

$ echo "$ naam: 3: 3" dio 

Als het compensatie negatief is, wordt het berekend vanaf het einde van de string. In dit geval moet er een extra spatie achter worden toegevoegd : anders zal de shell het beschouwen als een ander type uitbreiding geïdentificeerd door :- die wordt gebruikt om een ​​standaardwaarde op te geven als de parameter die moet worden uitgebreid niet bestaat (we hebben erover gesproken in het artikel over het beheren van de uitbreiding van lege of niet-ingestelde bash-variabelen):

$ echo "$ naam: -6" Volgzaam

Als het voorzien lengte negatief is, in plaats van te worden geïnterpreteerd als het totale aantal tekens dat de resulterende string lang zou moeten zijn, wordt het beschouwd als een offset die moet worden berekend vanaf het einde van de string. Het resultaat van de uitbreiding zal dan ook een deelstring zijn vanaf compensatie en eindigend op lengte tekens vanaf het einde van de originele string:

$ echo "$ naam: 7: -3" Doc 

Bij gebruik van deze uitbreiding en parameter is een geïndexeerde array waarop is geabonneerd * of @, de compensatie is relatief ten opzichte van de indexen van de array-elementen. Bijvoorbeeld:

$ my_array = (een twee drie) $ echo "$ my_array [@]: 0: 2" een twee $ echo "$ my_array [@]: -2" twee drie

Een negatief lengte , genereert in plaats daarvan een uitbreidingsfout:

$ echo "$ my_array [@]: 0: -2" bash: -2: subtekenreeks-expressie < 0 

"Lengte" -uitbreiding

Bij gebruik van de $ # parameter uitbreiding, het resultaat van de uitbreiding is niet de waarde van de parameter, door zijn lengte:

$ name = "Egidio" $ echo "$ # naam" 6

Wanneer parameter is een array en er is een abonnement op * of @, het aantal elementen erin wordt geretourneerd:

$ my_array = (een twee drie) echo "$ # my_array [@]" 3

Wanneer naar een specifiek element van de array wordt verwezen, wordt in plaats daarvan de lengte geretourneerd:

$ echo "$ # my_array [2]" 5

Alles bij elkaar

In dit artikel hebben we de syntaxis van veel uitbreidingen gezien. We hebben gezien hoe je de eerste letter van de string die het resultaat is van de uitbreiding van een variabele in kleine letters of hoofdletters kunt zetten, hoe je een niveau van indirectheid gebruikt, hoe je subtekenreeksen verwijdert en uitbreidt, hoe je een patroon vervangt door een opgegeven string en hoe laat een parameter worden uitgebreid in de lengte van zijn waarde, in plaats van zijn waarde zelf.
Dit is geen uitputtende lijst van alle mogelijke uitbreidingen die we kunnen uitvoeren met bash: raadpleeg de GNU-documentatie als je meer wilt weten. In het artikel noemden we ook bash-arrays: om meer over hen te weten, kunt u ons speciale bash-arrays-artikel lezen.




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