Τα λεξικά Bash σας δίνουν χάρτες hash και συστοιχίες συστοιχιών στα σενάρια Shell Linux. Θα σας δείξουμε πώς να χρησιμοποιήσετε αυτές τις ισχυρές και χρήσιμες δομές δεδομένων στα δικά σας σενάρια κέλυφος Linux.
Ένα τριαντάφυλλο με οποιοδήποτε άλλο όνομα
Το επίσημο όνομα για τα λεξικά είναι συστατικά συστοιχίες. Ονομάζονται επίσης πίνακες hash και χάρτες hash. Είναι μια δομή δεδομένων που λειτουργεί ομοίως με μια τακτική σειρά, αλλά με σημαντική διαφορά.
Ένας πίνακας είναι μια συλλογή τιμών δεδομένων που κρατούνται σε μία δομή δεδομένων. Για να αποκτήσετε πρόσβαση σε οποιαδήποτε από τις τιμές δεδομένων, τα οποία είναι γνωστά ως στοιχεία συστοιχίας, πρέπει να γνωρίζετε τη θέση τους στη συστοιχία. Η θέση του στοιχείου συστοιχίας στη συστοιχία είναι γνωστή ως δείκτης του, οπότε αυτοί οι τύποι συστοιχιών είναι γνωστές ως ευρεσιτεχνίες συστοιχίες. Είναι οι πιο συχνά χρησιμοποιούμενοι τύποι συστοιχιών.
Ωστόσο, έχουν ένα μειονέκτημα. Πώς αποκτάτε πρόσβαση σε ένα στοιχείο συστοιχίας εάν δεν γνωρίζετε τη θέση του μέσα στη λίστα; Πρέπει να εκτελέσετε όλα τα στοιχεία της σειράς, δοκιμάστε για να δείτε αν η τιμή σε αυτή τη θέση είναι αυτή που ψάχνετε.
Οι συστοθεισές συστοιχίες ξεπερνούν το ζήτημα αυτό. Δεν χρησιμοποιούν ακέραιους αριθμούς για να αναγνωρίζουν μοναδικά στοιχεία συστοιχίας. Χρησιμοποιούν μοναδικές λέξεις γνωστές ως λέξεις-κλειδιά. Μπορείτε να ανακτήσετε την τιμή για ένα στοιχείο συστοιχίας χρησιμοποιώντας τη λέξη-κλειδί του, ανεξάρτητα από το πού βρίσκεται στο πλαίσιο του πίνακα. Με μια ευρετηριακή συστοιχία, οι αριθμοί ακέραιων που αντιπροσωπεύουν τις θέσεις εντός του πίνακα βρίσκονται σε αύξουσα σειρά. Οι λέξεις-κλειδιά σε μια συσχετισμό συστοιχία μπορούν να είναι σε οποιαδήποτε σειρά.
Μπορείτε να αναζητήσετε μια τιμή σε μια συσχετιστική συστοιχία αναζητώντας τη λέξη-κλειδί. Αναζητώντας μια λέξη και την ανάκτηση των συναφών μιμητικών της αξίας ανατρέχοντας μια λέξη σε ένα λεξικό και να βρει το νόημά της. Αυτός είναι ο λόγος για τον οποίο οι συστοιχίες συστατικών είναι γνωστές ως λεξικά.
Bash 4.0 ή υψηλότερη
Οι συσχετιστικές συστοιχίες υποστηρίζονται στο το κέλυφος του bash Έκδοση 4.0 ή υψηλότερη. Εάν χρησιμοποιείτε μια τρέχουσα διανομή Linux, θα πρέπει να είστε εντάξει. Για να ελέγξετε την έκδοση Bash, χρησιμοποιήστε αυτήν την εντολή:
Bash --Version
Το μηχάνημα που χρησιμοποιείται για την έρευνα αυτού του άρθρου έχει Bash 5.1.4 εγκατεστημένο, οπότε είμαστε καλά να πάμε.
Βασικές αρχές
Για να δημιουργήσετε μια συσχετιστική συστοιχία στη γραμμή εντολών τερματικού ή σε μια δέσμη ενεργειών, χρησιμοποιούμε την εντολή Bash δηλώσει. ο
-ΕΝΑ
(Συνεταιριστική) Η επιλογή λέει Bash ότι αυτή θα είναι μια συσχετιστική σειρά και όχι μια ευρετηριακή συστοιχία.
δηλώνει - Ακρωνύμια
Αυτό δημιουργεί έναν συστατικό πίνακα που ονομάζεται "ακρωνύμια".
Για να βάλετε ορισμένα δεδομένα στη συστοιχία μας, πρέπει να παράσχουμε λέξεις-κλειδιά και τιμές. Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας αυτή τη μορφή:
Array-Name [KEY] = Αξία
Ας προσθέσουμε κάποια στοιχεία συστοιχίας:
Ακρωνύμια [ACK] = Αναγνώριση
Ακρωνύμια [BGP] = "Πρωτόκολλο πύλης συνόρων"
Ακρωνύμια [CIDR] = "Ακίνητη δρομολόγηση μεταξύ διαχωρισμού"
Ακρωνύμια [DHCP] = "Δυναμικό πρωτόκολλο διαμόρφωσης κεντρικού υπολογιστή"
Ακρωνύμιο [EOF] = "Τέλος πλαισίου"
Αυτές οι εντολές ορίζουν πέντε στοιχεία συστοιχίας. Σημειώστε ότι οι τιμές είναι τυλιγμένες σε εισαγωγικά εάν υπάρχουν κενά στην τιμή. Οι λέξεις-κλειδιά μας καταχωρήθηκαν με αλφαβητική σειρά, αλλά μπορούν να εισαχθούν σε οποιαδήποτε σειρά που σας αρέσουν. Οι λέξεις-κλειδιά πρέπει να είναι μοναδικές. Εάν προσπαθήσετε να δημιουργήσετε δύο καταχωρήσεις με την ίδια λέξη-κλειδί, η δεύτερη τιμή που εισάγετε θα αντικαταστήσετε το πρώτο. Θα έχετε ακόμα μόνο μία καταχώρηση με αυτή τη λέξη-κλειδί και θα συσχετιστεί με τη δεύτερη τιμή που προσθέσατε.
Για να ανακτήσετε τιμές από τη συστοιχία, χρησιμοποιούμε εντολές σε αυτή τη μορφή:
$ {ARRAY-NAME [KEY]}
Μπορούμε να χρησιμοποιήσουμε ηχώ για να στείλουμε την έξοδο στο παράθυρο τερματικού:
ECHO $ {ACRONYMS [ACK]}
ECHO $ {ACRONYMS [DHCP]}
Χρησιμοποιώντας βρόχους
Οι πίνακες προσφέρονται για να χρησιμοποιηθούν σε βρόχους πολύ καλά. Πίνακας συσχέτισης δεν αποτελούν εξαίρεση. Loops παρέχουν αποτελεσματικούς τρόπους για να επικαλεστεί μια σειρά ενεργειών χωρίς επαναλαμβανόμενα τμήματα του κώδικα. Πριν ασχοληθούμε με βρόχους, υπάρχει ένας αποτελεσματικός τρόπος για να δηλώσει συστοιχίες.
Δημιουργούμε τις συστοιχίες χρησιμοποιώντας το
δηλώνω
εντολή (το ίδιο
-ΕΝΑ
επιλογή όπως και πριν), αλλά παρέχουμε τις λέξεις-κλειδιά και τις αξίες ως λίστα στη γραμμή εντολών.
δηλώνουν -Α χώρες = ([ALB] = Αλβανία [BHR] = Μπαχρέιν [CMR] = Καμερούν [DNK] = Δανία [EGY] = Αίγυπτος)
Το όνομα του πίνακα είναι «χώρες», και είναι συνδεδεμένο με τον κατάλογο αξία από ένα σύμβολο ίσον»
=
. " Ο κατάλογος τιμή είναι τυλιγμένο σε παρένθεση «
()
»Και κάθε λέξη-κλειδί είναι τυλιγμένο σε παρένθεση«
[]
«. Σημειώνεται ότι δεν υπάρχουν κόμματα που χωρίζει τις τιμές. Εάν έχετε ένα string τιμή που περιέχει κενά, θα πρέπει να το τυλίξετε σε εισαγωγικά.
Για να κάνετε ένα associative array επιστρέψει μια λέξη-κλειδί αντί για την τιμή, προσθέστε ένα θαυμαστικό «
!
»Μπροστά από το όνομα του πίνακα. Η σε σύμβολο «
@
»Μπορεί να χρησιμοποιηθεί ως ένα μπαλαντέρ, που σημαίνει όλα τα στοιχεία συστοιχίας.
Αυτό
Για
βρόχος θα εμφανίσει όλες τις λέξεις-κλειδιά:
για το κλειδί στο "$ {χώρες [@]!}"? κάνει echo $ key? γίνεται
Σημειώστε ότι οι λέξεις-κλειδιά που δεν είναι απαραίτητα παρατίθενται με τη σειρά που έχουν δημιουργηθεί, αλλά αυτό δεν έχει σημασία. Πίνακας συσχέτισης δεν βασίζονται σε μια διέταξε δείκτη.
Μπορούμε επίσης να χρησιμοποιήσουμε την επέκταση παραμέτρων για την καταγραφή όλων των λέξεων-κλειδιών. Θα πρέπει να αναφέρονται σε μία γραμμή, δεν είναι μία ανά γραμμή.
echo "$ {! Χώρες [@]}"
echo "$ {! Αρκτικόλεξα [@]}"
Μπορούμε να αυξήσουν μας
Για
βρόχο για να εκτυπώσετε τις λέξεις-κλειδιά και τις τιμές ταυτόχρονα.
για το κλειδί στο "$ {ακρωνύμια [@]!}"? κάνει echo "$ κλειδί - $ {αρκτικόλεξα [πλήκτρο $]}"? γίνεται
Αν θέλουμε να γνωρίζουμε πόσα στοιχεία υπάρχουν στους πίνακες, μπορούμε να χρησιμοποιήσουμε ένα hash «#» μπροστά από το όνομα του πίνακα αντί για ένα θαυμαστικό.
echo "$ {! Χώρες [@]}"
echo "$ {! Αρκτικόλεξα [@]}"
Έλεγχος Αυτή η σειρά στοιχείων Υπάρχει
Αν ψάχνετε για μια λέξη-κλειδί, αλλά δεν υπάρχει τέτοιο στοιχείο του πίνακα, η τιμή που επιστρέφεται θα είναι ένα κενό string. Μερικές φορές είναι χρήσιμο να έχουμε μια διαφορετική ένδειξη για την παρουσία ή απουσία ενός στοιχείου συστοιχίας.
Μπορούμε να ελέγχεται η παρουσία ενός στοιχείου πίνακα χρησιμοποιώντας το «
+ _
" χειριστής. Σημειώστε ότι αυτή έρχεται μετά από τη λέξη-κλειδί, όχι μπροστά από το όνομα του πίνακα, όπως τα προηγούμενα φορείς που έχουμε δει.
αν [$ {ακρωνύμια [EOF] + _}]? τότε echo «Βρέθηκαν»? άλλο echo «Δεν βρέθηκε»? fi
αν [$ {ακρωνύμια [FTP] + _}]? τότε echo «Βρέθηκαν»? άλλο echo «Δεν βρέθηκε»? fi
Το στοιχείο του πίνακα με τη λέξη-κλειδί «ΕΟΦ» βρίσκεται στον πίνακα, αλλά το στοιχείο του πίνακα με τη λέξη-κλειδί «FTP» δεν είναι.
Προσθήκη Array Elements
Προσθέτοντας νέα στοιχεία σε ένα associative array είναι εύκολο. Σε αντίθεση με ορισμένες γλώσσες προγραμματισμού, δεν χρειάζεται να ορίσετε το μέγεθος του πίνακα σας όταν το δηλώνουν. Μπορείτε να συνεχίσουμε να προσθέτουμε νέα στοιχεία χωρίς να χτυπήσει ένα προκαθορισμένο ανώτατο όριο.
Για να προσθέσετε ένα νέο στοιχείο στη σειρά, χρησιμοποιούμε το «
+ =
" χειριστής.
χώρες + = ([FJI] = Fiji)
echo "$ (# χώρες [@]}"
echo $ {χώρες [FJI]}
Ο αριθμός των στοιχείων του πίνακα είναι τώρα έξι, και την αναζήτηση για τη νέα λέξη-κλειδί βρίσκει το στοιχείο του πίνακα και επιστρέφει την αξία του.
Αφαίρεση στοιχεία πίνακα και πίνακες
ο
απενεργοποιημένο
η εντολή χρησιμοποιείται για την αφαίρεση στοιχείων συστοιχίας. Αν η λέξη-κλειδί έχει χώρους σε αυτό, τυλίξτε το σε εισαγωγικά.
unset αρκτικόλεξα [EOF]
αν [$ {ακρωνύμια [EOF] + _}]? τότε echo «Βρέθηκαν»? άλλο echo «Δεν βρέθηκε»? fi
Για να αφαιρέσετε το σύνολο της συστοιχίας, χρήση
απενεργοποιημένο
με το όνομα του πίνακα.
unset χώρες
Χρήση μεταβλητών με πίνακες
Χρησιμοποιώντας τις μεταβλητές με πίνακας συσχέτισης είναι απλή. Σε αυτό το παράδειγμα, θα ορίσουμε μια μεταβλητή-κλειδί για τη συμβολοσειρά «ΕΟΦ.» Θα χρησιμοποιήσουμε τη μεταβλητή όταν προσθέτουμε ένα νέο στοιχείο του πίνακα με τη σειρά. Στην πραγματικότητα, θα αντικαταστήσουμε το στοιχείο του πίνακα ώστε να διαγραφεί νωρίτερα.
Θα ανακτήσετε το νέο στοιχείο συστοιχίας καλώντας το με τη νέα λέξη-κλειδί και επίσης, χρησιμοποιώντας τη μεταβλητή. Εάν η λέξη-κλειδί περιέχει κενά, θα χρειαστεί να τυλίξετε το όνομα μεταβλητής σε εισαγωγικά.
Κλειδί = EOF
Ακρωνύμια [$ key] = "Τέλος πλαισίου"
ECHO $ {Ακρωνύμιο [EOF]}
ECHO $ {ACronyms [$ KEY]}
Πάρτε δημιουργικό
Τα παραδείγματα μας ήταν συλλογές πληροφοριών όπου κάθε στοιχείο συστοιχίας είναι ανεξάρτητο από όλα τα άλλα, σαν ένα λεξικό. Ο καθένας είναι ένας μοναδικός ορισμός. Αλλά οι συσχετισμένες συστοιχίες μπορούν εξίσου εύκολα να κατέχουν μια ποικιλία πληροφοριών που σχετίζονται με ένα πράγμα, όπως οι προδιαγραφές διαφόρων τεμαχίων υλικού υπολογιστών:
Δηλώστε -Α Προδιαγραφή
Προδιαγραφές [CPU] = "Δύο πυρήνα AMD RYZEN 5 3600"
Προδιαγραφή [Ταχύτητα] = "3600 MHz"
Προδιαγραφές [Kernel] = "5.11.0-17-Generic X86_64"
Προδιαγραφές [MEM] = "1978,5 MIB"
Προδιαγραφή [Αποθήκευση] = "32 gib"
Προδιαγραφή [Shell] = "Bash"
ECHO $ {Προδιαγραφή [CPU]}
Η γραφή αποτελεσματική σε μια γλώσσα σημαίνει να γνωρίζετε τους μηχανισμούς και τις δομές που προσφέρει και επιλέγοντας το πιο κατάλληλο για το πρόβλημα που προσπαθείτε να λύσετε. Οι συστοιχίες συστοιχιών σας δίνουν έναν εύκολο στη χρήση τρόπο αποθήκευσης δεδομένων που μπορείτε να αναζητήσετε με όνομα, ακριβώς όπως ένα λεξικό.