Bash og shell-udvidelser: doven listeopstilling

Det er den tid på året igen! Når butikker begynder at sætte farverige gnistrende oplyste plastbits op, begynder vi alle at føle os lidt festlige, og ved festlig mener jeg, at vi skal shoppe. Specielt ferie gave shopping! (Gaver til dig selv er stadig gaver, teknisk set.)

Bare så dette ikke alt sammen går helt vildt, skal du lave nogle gavelister. Bash kan hjælpe.

Brace ekspansion

Disse er ikke seler: ()

Det er heller ikke disse: []

Disse er seler:{}

Bøjler fortæller Bash at gøre noget med den vilkårlige streng eller de strenge, den finder mellem dem. Flere strenge er kommasepareret: {a,b,c}. Du kan også tilføje en valgfri indledning og efterskrift, der skal vedhæftes hvert udvidede resultat. Dette kan for det meste spare nogle typer, f.eks. Med almindelige filstier og udvidelser.

Lad os lave nogle lister for hver person, vi vil give ting til. Følgende kommandoer er ækvivalente:

touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txt
touch /home/me/gift-lists/{Amy,Bryan,Charlie}.txt
tree gift-lists /home/me/gift-lists ├── Amy.txt ├── Bryan.txt └── Charlie.txt

Åh darn, "Bryan" staver sit navn med et "i." Det kan jeg ordne.

mv /home/me/gift-lists/{Bryan,Brian}.txt renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'

Shell-parameterudvidelser

Shell-parameterudvidelse giver os mulighed for at foretage alle mulige ændringer af parametre, der er lukket i seler, som manipulering og erstatning af tekst.

Der er et par strømper, som alle vores giftees fortjener. Lad os gøre det til en variabel:

STUFF=$'socks\nlump of coal\nwhite chocolate' echo "$STUFF" socks lump of coal white chocolate

Nu for at tilføje disse emner til hver af vores lister med lidt hjælp fra teekommandoen til at få echoog udvidelser til at spille godt.

echo "$STUFF" | tee {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks lump of coal white chocolate socks lump of coal white chocolate socks lump of coal white chocolate

Mønster match udskiftning

Ved anden tanke er kulklumpen måske ikke sådan en dejlig gave. Du kan erstatte det med noget bedre ved hjælp af en mønstermatch-erstatning i form af ${parameter/pattern/string}:

echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks candy cane white chocolate socks candy cane white chocolate socks candy cane white chocolate

Dette erstatter den første forekomst af "kulklump" med "slikrør." For at erstatte alle forekomster (hvis der var flere) skal du bruge ${parameter//pattern/string}. Dette ændrer ikke vores $STUFFvariabel, så vi kan stadig genbruge den oprindelige liste til en fræk senere.

Understrenge

Mens vi forbedrer tingene, kan vores giftees måske ikke alle lide hvid chokolade. Vi må hellere tilføje lidt almindelig chokolade til vores lister i tilfælde af. Da jeg er super doven, skal jeg bare trykke på pil op og ændre en tidligere Bash-kommando. Heldigvis er det sidste ord i $STUFFvariablen “chokolade”, som er ni tegn lang, så jeg vil bede Bash om at holde netop den del ved hjælp ${parameter:offset}. Jeg vil bruge tee's -aflag til append til mine eksisterende lister:

echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks candy cane white chocolate chocolate socks candy cane white chocolate chocolate socks candy cane white chocolate chocolate

Du kan også:

Gør dette Med dette
Få substring fra n tegn og frem ${parameter:n}
Få understreng til x tegn, der starter ved n ${parameter:n:x}

Der! Nu er vores basislister færdige. Lad os få noget æg.

Test variabler

Du ved, det kan være æggeblokken, men jeg tror, ​​jeg startede en liste til Amy i går og lagrede den i en variabel, som jeg måske havde kaldt amy. Lad os se, om jeg gjorde det. Jeg bruger ${parameter:?word}udvidelsen. Det skriver wordtil standardfejl og afslutter, hvis der ikke er nogen amyparameter.

echo "${amy:?no such}" bash: amy: no such

Det tror jeg ikke. Måske var det Brian i stedet?

echo "${brian:?no such}" Lederhosen

Du kan også:

Gør dette Med dette
Erstat, wordhvis ikke parameterer indstillet eller nul ${parameter:-word}
Erstat, wordhvis parameterikke er afbrudt eller null ${parameter:+word}
Tildel wordtil parameterhvis ikke parameterer indstillet eller null ${parameter:=word}

Skifter sag

Det er rigtigt! Brian sagde, at han ville have noget lederhosen, og så skrev jeg mig en note. Dette er ret vigtigt, så jeg tilføjer det til Brian's liste med store bogstaver med ${parameter^^pattern}udvidelsen. Den patterndel er valgfri. Vi skriver kun til Brian's liste, så jeg bruger bare i >>stedet for tee -a.

echo "${brian^^}" >> Brian.txt cat Brian.txt socks candy cane white chocolate chocolate LEDERHOSEN

Du kan også:

Gør dette Med dette
Brug det første bogstav med store bogstaver ${parameter^pattern}
Små bogstaver med små bogstaver ${parameter,pattern}
Små bogstaver ${parameter,,pattern}

Udvidede arrays

Ved du hvad, al denne gaveforretningsvirksomhed er meget arbejde. Jeg skal bare lave en række ting, jeg så i butikken:

gifts=(sweater gameboy wagon pillows chestnuts hairbrush)

Jeg kan bruge substring-ekspansion i form af for ${parameter:offset:length}at gøre dette simpelt. Jeg tilføjer de to første til Amys liste, de to midterste til Brian og de sidste to til Charlies. Jeg bruger det printftil at hjælpe med nye linjer.

printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt printf '%s\n' "${gifts[@]: -2}" >> Charlie.txt
cat Amy.txt socks candy cane white chocolate chocolate sweater gameboy cat Brian.txt socks candy cane white chocolate chocolate LEDERHOSEN wagon pillows cat Charlie.txt socks candy cane white chocolate chocolate chestnuts hairbrush

Der! Nu har vi et omfattende sæt superpersonificerede gavelister. Tak Bash! Alt for dårlig, det kan heller ikke handle for os.