Επεκτάσεις Bash και shell: τεμπέλης κατάλογο

Είναι και πάλι η εποχή του χρόνου! Όταν τα καταστήματα αρχίζουν να χρησιμοποιούν πολύχρωμα πλαστικά φωτισμένα κομμάτια, όλοι αρχίζουμε να νιώθουμε λίγο εορταστικοί, και από εορταστικούς, ας πάμε για ψώνια. Συγκεκριμένα, ψώνια δώρων διακοπών! (Τα δώρα για τον εαυτό σας είναι ακόμα δώρα, τεχνικά.)

Ακριβώς έτσι ώστε όλα αυτά να μην είναι εντελώς τρελό, θα πρέπει να δημιουργήσετε λίστες δώρων. Το Bash μπορεί να βοηθήσει.

Επέκταση στήριξης

Αυτά δεν είναι τιράντες: ()

Ούτε είναι αυτά: []

Αυτά είναι τιράντες:{}

Οι τιράντες λένε στον Bash να κάνει κάτι με την αυθαίρετη χορδή ή χορδές που βρίσκει μεταξύ τους. Πολλαπλές χορδές είναι διαχωρισμένες με κόμμα: {a,b,c}. Μπορείτε επίσης να προσθέσετε ένα προαιρετικό προοίμιο και ένα σενάριο που θα επισυνάπτεται σε κάθε εκτεταμένο αποτέλεσμα. Κυρίως, αυτό μπορεί να σώσει κάποια πληκτρολόγηση, όπως με κοινές διαδρομές αρχείων και επεκτάσεις.

Ας φτιάξουμε λίστες για κάθε άτομο στο οποίο θέλουμε να δώσουμε πράγματα. Οι ακόλουθες εντολές είναι ισοδύναμες:

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

Ωχ, το "Μπράιαν" γράφει το όνομά του με το "i". Μπορώ να το διορθώσω.

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

Επεκτάσεις παραμέτρων κελύφους

Η επέκταση παραμέτρων κελύφους μας επιτρέπει να κάνουμε κάθε είδους αλλαγές σε παραμέτρους που περικλείονται σε αγκύλες, όπως χειρισμός και αντικατάσταση κειμένου.

Υπάρχουν μερικά γεμιστικά που αξίζουν όλοι οι δώρα μας. Ας κάνουμε μια μεταβλητή:

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

Τώρα για να προσθέσετε αυτά τα στοιχεία σε καθεμία από τις λίστες μας με κάποια βοήθεια από την teeεντολή για να πάρετε echoκαι επεκτάσεις για να παίξετε ωραία.

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

Αντικατάσταση αγώνα μοτίβου

Στη δεύτερη σκέψη, ίσως το κομμάτι άνθρακα δεν είναι τόσο ωραίο δώρο. Μπορείτε να το αντικαταστήσετε με κάτι καλύτερο χρησιμοποιώντας μια αντικατάσταση μοτίβου με τη μορφή ${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

Αυτό αντικαθιστά την πρώτη παρουσία του «κομματιού άνθρακα» με το «ζαχαροκάλαμο καραμελών». Για να αντικαταστήσετε όλες τις παρουσίες (εάν υπήρχαν πολλές), χρησιμοποιήστε το ${parameter//pattern/string}. Αυτό δεν αλλάζει τη $STUFFμεταβλητή μας , επομένως μπορούμε ακόμα να επαναχρησιμοποιήσουμε την αρχική λίστα για κάποιον άτακτο αργότερα.

Υποστρώματα

Ενώ βελτιώνουμε τα πράγματα, τα δώρα μας μπορεί να μην αρέσουν σε όλους τη λευκή σοκολάτα. Καλύτερα να προσθέσουμε κάποια κανονική σοκολάτα στις λίστες μας για κάθε περίπτωση. Επειδή είμαι πολύ τεμπέλης, απλώς πρόκειται να πατήσω το πάνω βέλος και να τροποποιήσω μια προηγούμενη εντολή Bash. Ευτυχώς, η τελευταία λέξη στη $STUFFμεταβλητή είναι «σοκολάτα», η οποία έχει μήκος εννέα χαρακτήρων, οπότε θα πω στον Bash να συνεχίσει να χρησιμοποιεί μόνο αυτό το μέρος ${parameter:offset}. Θα χρησιμοποιήσω teeτη -aσημαία για να aενσωματώσω τις υπάρχουσες λίστες μου:

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

Μπορείτε επίσης να:

Κάνε αυτό Με αυτό
Λάβετε substring από n χαρακτήρες και μετά ${parameter:n}
Λάβετε substring για χαρακτήρες x ξεκινώντας από n ${parameter:n:x}

Εκεί! Τώρα οι βασικές λίστες μας έχουν ολοκληρωθεί. Ας πάρουμε λίγο eggnog.

Δοκιμή μεταβλητών

Ξέρετε, μπορεί να είναι το eggnog, αλλά νομίζω ότι ξεκίνησα μια λίστα για την Amy χθες και την έχω αποθηκεύσει σε μια μεταβλητή που ίσως θα έλεγα amy. Ας δούμε αν το έκανα. Θα χρησιμοποιήσω την ${parameter:?word}επέκταση. Θα γράψει wordσε τυπικό σφάλμα και θα βγεί αν δεν υπάρχει amyπαράμετρος.

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

Μάλλον όχι. Ίσως ήταν ο Μπράιαν;

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

Μπορείτε επίσης να:

Κάνε αυτό Με αυτό
Αντικαταστήστε wordεάν parameterείναι μη ρυθμισμένο ή μηδενικό ${parameter:-word}
Αντικαταστήστε wordεάν parameterδεν έχει οριστεί ή μηδενικό ${parameter:+word}
Αντιστοιχίστε wordσε parameterεάν parameterείναι μη ορισμένο ή μηδενικό ${parameter:=word}

Αλλαγή περίπτωσης

That’s  right! Brian said he wanted some lederhosen and so I made myself a  note. This is pretty important, so I’ll add it to Brian’s list in  capital letters with the ${parameter^^pattern} expansion. The pattern part is optional. We’re only writing to Brian’s list, so I’ll just use >> instead of tee -a.

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

You can also:

Do this With this
Capitalize the first letter ${parameter^pattern}
Lowercase the first letter ${parameter,pattern}
Lowercase all letters ${parameter,,pattern}

Expanding arrays

You know what, all this gift-listing business is a lot of work. I’m just going to make an array of things I saw at the store:

gifts=(sweater gameboy wagon pillows chestnuts hairbrush)

I can use substring expansion in the form of ${parameter:offset:length} to make this simple. I’ll add the first two to Amy’s list, the middle two to Brian’s, and the last two to Charlie’s. I’ll use printf to help with newlines.

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

Εκεί! Τώρα έχουμε μια ολοκληρωμένη σειρά από εξαιρετικά εξατομικευμένες λίστες δώρων. Ευχαριστώ Bash! Κρίμα που δεν μπορεί να κάνει τις αγορές μας.