Jeg ser at i Bash> 4.0 brukes variabel utvidelse til å variere en variabel. For eksempel
echo ${variable,,}
Når jeg leser man-siden , skjønner jeg ikke hvorfor skallet konverterer strengen til små bokstaver.
Et sekvensuttrykk har formen {x..y [.. incr]}, hvor x og y er enten heltall eller enkelttegn, og inkr, et valgfritt trinn, er et heltall. Når heltall blir gitt utvides uttrykket til hvert tall mellom x og y, inkludert. Medfølgende heltal kan være prefikset med 0 for å tvinge hvert ord til å ha samme bredde. Når enten x eller y begynner med null, forsøker skallet å tvinge alle genererte termer til å inneholde det samme antallet sifre, nullstille når det er nødvendig. Når tegn leveres, utvides uttrykket til hvert tegn leksikografisk mellom x og y, inkludert, ved bruk av standard C-lokalitet. Vær oppmerksom på at både x og y må være av samme type. Når inkrementet leveres, brukes det som forskjellen mellom hvert begrep. Standardinkrementet er 1 o r -1 etter behov.
Hvorfor konverteres variabelen til små bokstaver?
Svar
Du leser feil del av dokumentasjonen; se på utvidelse av skallparameter i stedet.
${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}
Denne utvidelsen endrer tilfelle alfabetiske tegn i
parameter
.pattern
utvides for å produsere et mønster akkurat som i filnavnutvidelse. Hvert tegn i den utvidede verdien tilparameter
blir testet motpattern
, og hvis det samsvarer med mønsteret, blir dets bokstav konvertert. Mønsteret skal ikke forsøke å matche mer enn ett tegn. Operatøren ‘^’ konverterer små bokstaver som matcher mønster til store bokstaver; , operatøren konverterer samsvarende store bokstaver til små bokstaver. Utvidelsene ‘^^’ og ‘,,’ konverterer hvert samsvarende tegn i den utvidede verdien; ^ og , utvidelsene samsvarer med og konverterer bare det første tegnet i den utvidede verdien. Hvispattern
utelates, blir det behandlet som et ‘?’, Som samsvarer med alle tegn. Hvisparameter
er ‘@’ eller ‘*’, blir saksendringsoperasjonen brukt på hver posisjonsparameter i sin tur, og utvidelsen er den resulterende listen. Hvisparameter
er en arrayvariabel som er tegnet med @ eller *, blir saksendringsoperasjonen brukt på hvert medlem av arrayet i sin tur, og utvidelsen er den resulterende listen.
Svar
Du siterer delen for «Brace Expansion», En «Brace-utvidelse» starter ikke med en $
.
Du bør utføre denne kommandoen:
LESS=+/"\{parameter\^pattern\}" man bash
For å finne den delen av «saksendring» som starter med en $
(${ ^^ }
).