Ik zie dat in Bash> 4.0 variabele expansie wordt gebruikt om een variabele in kleine letters te zetten. Bijvoorbeeld
echo ${variable,,}
Het lezen van de man-pagina Ik snap echt niet waarom de shell converteert de tekenreeks naar kleine letters.
Een reeksuitdrukking heeft de vorm {x..y [.. incr]}, waarbij x en y ofwel gehele getallen of enkele tekens, en incr, een optioneel increment, is een geheel getal. Als er gehele getallen worden opgegeven, wordt de uitdrukking uitgebreid naar elk getal tussen x en y, inclusief. De opgegeven gehele getallen kunnen worden voorafgegaan door 0 om ervoor te zorgen dat elke term de dezelfde breedte. Wanneer x of y met een nul begint, probeert de shell alle gegenereerde termen te dwingen hetzelfde aantal cijfers te bevatten, waar nodig met nulopvulling. Wanneer tekens worden opgegeven, wordt de uitdrukking lexicografisch uitgebreid naar elk teken tussen x en y, inclusief, met de standaard C-landinstelling. Merk op dat x en y van hetzelfde type moeten zijn. Wanneer de toename wordt opgegeven, wordt deze gebruikt als het verschil tussen elke term. De standaardwaarde is 1 o r -1 zoals van toepassing.
Waarom wordt de variabele geconverteerd naar kleine letters?
Antwoord
Je leest de verkeerde sectie van de documentatie; kijk in plaats daarvan naar uitbreiding van shellparameters .
${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}
Deze uitbreiding wijzigt het geval van alfabetische tekens in
parameter
. Depattern
wordt uitgebreid om een patroon te produceren, net als bij het uitbreiden van bestandsnamen. Elk teken in de uitgebreide waarde vanparameter
wordt getest tegenpattern
, en als het overeenkomt met het patroon, wordt de hoofdletter geconverteerd. Het patroon mag niet proberen om met meer dan één teken overeen te komen. De ‘^’ -operator converteert het patroon van kleine letters naar hoofdletters; de ‘,’ -operator zet overeenkomende hoofdletters om in kleine letters. De ‘^^’ en ‘,,’ uitbreidingen zetten elk overeenkomend teken in de uitgevouwen waarde om; de uitbreidingen ‘^’ en ‘,’ komen overeen en converteren alleen het eerste teken in de uitgevouwen waarde. Alspattern
wordt weggelaten, wordt het behandeld als een ‘?’, Die overeenkomt met elk teken. Alsparameter
‘@’ of ‘*’ is, wordt de hoofdletterwijziging achtereenvolgens op elke positionele parameter toegepast en is de uitbreiding de resulterende lijst. Alsparameter
een arrayvariabele is met het onderschrift @ of *, wordt de bewerking voor het wijzigen van hoofdletters achtereenvolgens op elk lid van de array toegepast en is de uitbreiding de resulterende lijst.
Antwoord
U citeert het gedeelte voor “Brace Expansion”, Een “accolade-uitbreiding” begint niet met een $
.
U moet deze opdracht uitvoeren:
LESS=+/"\{parameter\^pattern\}" man bash
Om het deel van “case-modificatie” te vinden dat begint met een $
(${ ^^ }
).