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 tee
kommandoen til at få echo
og 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 $STUFF
variabel, 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 $STUFF
variablen “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 -a
flag til a
ppend 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 word
til standardfejl og afslutter, hvis der ikke er nogen amy
parameter.
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, word hvis ikke parameter er indstillet eller nul |
${parameter:-word} |
Erstat, word hvis parameter ikke er afbrudt eller null |
${parameter:+word} |
Tildel word til parameter hvis ikke parameter er 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 pattern
del 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 printf
til 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.