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

Οι διαχειριστές συστήματος Linux και Mac είναι συνήθως εξοικειωμένοι με τη δέσμη ενεργειών μέσω του τερματικού, αλλά ακόμη και οι χρήστες των Windows μπορούν μπείτε στη δράση με το Υποσύστημα Windows για Linux.

Πώς να αποκτήσετε το Linux Bash Shell στα Windows 10

Χρειάζεται να χρησιμοποιήσετε το Linux χωρίς χρόνο για εναλλαγή σε διαφορετικό υπολογιστή ή εκτέλεση VM; Εκτελέστε το Linux στα Windows 10 με ένα τερματικό Bash shell!

Πώς λειτουργούν τα σενάρια Bash

Ένα σενάριο bash είναι απλώς ένα αρχείο απλού κειμένου που περιέχει μια σειρά εντολών που μπορεί να διαβάσει και να εκτελέσει το κέλυφος bash. Το Bash είναι το προεπιλεγμένο κέλυφος σε προ-Catalina macOS και στις περισσότερες διανομές Linux.

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

Αρχικά, δημιουργήστε το ακόλουθο αρχείο σε μια βολική τοποθεσία (ιδανικά, ανοίξτε ένα τερματικό και μεταβείτε πρώτα στον επιθυμητό κατάλογο):

#! / bin / bash
ηχώ "Γεια, Κόσμος"

Η πρώτη γραμμή λέει σε ό, τι εκτελεί αυτό το πρόγραμμα πώς να το εκτελέσετε (δηλαδή χρησιμοποιώντας τον διερμηνέα bash). Το δεύτερο είναι απλώς μια εντολή όπως οποιαδήποτε άλλη που μπορείτε να εισαγάγετε στη γραμμή εντολών. Αποθηκεύστε το αρχείο ως γεια_ο κόσμος.sh, έπειτα:

$ chmod + x hello_world.sh
$ ./hello_world.sh

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

Εάν δείτε τις λέξεις "Γεια, Κόσμος" να εμφανίζονται τυπωμένες σε μια γραμμή στο τερματικό σας, τότε όλα λειτουργούν όπως απαιτείται.

Πώς λειτουργούν οι βρόχοι

Στον γενικό προγραμματισμό, υπάρχουν δύο κύριοι τύποι βρόχου: αριθμητικός και για κάθε. Ο αριθμητικός τύπος είναι παραδοσιακά ο πιο συνηθισμένος, αλλά κατά τη χρήση bash, είναι συνήθως το αντίθετο.

Τα αριθμητικά για βρόχους συνήθως επικεντρώνονται σε έναν ενιαίο ακέραιο που καθορίζει πόσες επαναλήψεις θα πραγματοποιηθούν, για παράδειγμα:

για (i = 0; εγώ <100; εγώ ++) {
/ * δηλώσεις για εκτέλεση επανειλημμένα * /
}

Πρόκειται για έναν βρόχο που είναι γνωστός και θα επαναλαμβάνεται 100 φορές, εκτός εάν αλλάξω εντός του βρόχου ή μια άλλη δήλωση προκαλεί τη διακοπή της εκτέλεσης του βρόχου.

Οι βρόχοι Foreach, σε αντίθεση, τείνουν να λειτουργούν σε δομές όπως λίστες ή πίνακες και επαναλαμβάνουν κάθε στοιχείο της συγκεκριμένης συλλογής:

People = ["Peter", "Paul", "Mary"]
foreach (άτομα ως άτομο) {
αν (άτομο == "Παύλος") {
...
}
}

Ορισμένες γλώσσες χρησιμοποιούν μια ελαφρώς διαφορετική σύνταξη που ανταλλάσσει τη σειρά της συλλογής και του αντικειμένου:

People = ["Peter", "Paul", "Mary"]
για (άτομο σε άτομα) {
αν (άτομο == "Παύλος") {
...
}
}

Για σε βρόχους

Στο bash, το μπροστινό μέρος - ή για μεσα- το βρόχο είναι πιο συνηθισμένο. Η βασική σύνταξη είναι, απλά:

για arg στη [λίστα]
κάνω
/ * δηλώσεις για εκτέλεση επανειλημμένα * /
/ * η τιμή του arg μπορεί να ληφθεί χρησιμοποιώντας το $ arg * /
Έγινε

Για παράδειγμα, για επανάληψη μέσω τριών αρχείων με ρητά ονόματα:

για αρχείο σε one.c two.c three.c
κάνω
ls "$ αρχείο"
Έγινε

Εάν τέτοια αρχεία υπάρχουν στον τρέχοντα κατάλογο, η έξοδος από αυτό το σενάριο θα είναι:

ένα. γ
δύο.γ
τρία.γ

Αντί για ένα σταθερό σύνολο αρχείων, η λίστα μπορεί να ληφθεί μέσω ενός μοτίβου glob (ένα που περιλαμβάνει χαρακτήρες μπαλαντέρ - ειδικοί χαρακτήρες που αντιπροσωπεύουν άλλους χαρακτήρες). Στο ακόλουθο παράδειγμα, το for loop επαναλαμβάνεται σε όλα τα αρχεία (στον τρέχοντα κατάλογο) των οποίων τα ονόματα καταλήγουν σε ".xml":

για αρχείο σε * .xml
κάνω
ls -l "$ αρχείο"
Έγινε

Ακολουθεί ένα παράδειγμα εξόδου:

$ -rw-r - r-- 1 bobby staff 2436 3 Νοε 2019 2019 feed.xml
$ -rw-r - r-- 1 bobby προσωπικό 6447 27 Οκτ 16:24 sitemap.xml

Αυτό μπορεί να μοιάζει πολύ με έναν μακροχρόνιο τρόπο:

$ ls -l * .xml

Αλλά υπάρχει μια σημαντική διαφορά: το for loop εκτελεί το είναι πρόγραμμα 2 ξεχωριστές ώρες, με ένα μόνο όνομα αρχείου που του μεταβιβάζεται κάθε φορά. Στο ξεχωριστό παράδειγμα ls, το μοτίβο glob (* .xml) αντιστοιχεί πρώτα στα ονόματα αρχείων και στη συνέχεια στέλνει όλα αυτά, ως μεμονωμένες παραμέτρους γραμμής εντολών, σε μία παρουσία είναι.

Ακολουθεί ένα παράδειγμα που χρησιμοποιεί το τουαλέτα (καταμέτρηση λέξεων) πρόγραμμα για να κάνει τη διαφορά πιο εμφανής:

$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 συνολικά

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

για αρχείο σε * .xml
κάνω
wc -l $ αρχείο
Έγινε

Θα εξακολουθείτε να βλέπετε τον αριθμό για κάθε αρχείο:

44 feed.xml
231 sitemap.xml

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

Όταν μια λίστα δεν είναι λίστα

Υπάρχει ένα πολύ εύκολο και κοινό λάθος κατά την αντιμετώπιση βρόχων, λόγω του τρόπου με τον οποίο ο bash χειρίζεται τα αναφερόμενα επιχειρήματα / χορδές. Η αναζήτηση μέσω μιας λίστας αρχείων θα πρέπει να γίνει ως εξής:

για αρχείο στο one.c two.c

Οχι έτσι:

για αρχείο στο "one.c two.c"

Το δεύτερο παράδειγμα περικλείει ονόματα αρχείων σε διπλά εισαγωγικά που οδηγεί σε μια λίστα με μία μόνο παράμετρο. το for for loop θα εκτελεστεί μόνο μία φορά. Αυτό το πρόβλημα μπορεί να αποφευχθεί χρησιμοποιώντας μια μεταβλητή σε τέτοιες περιπτώσεις:

ΑΡΧΕΙΑ = "one.c two.c"
για αρχείο σε $ FILES
κάνω
...
Έγινε

Σημειώστε ότι η ίδια η μεταβλητή δήλωση πρέπει να συμπεριλάβει την τιμή της σε διπλά εισαγωγικά!

Για Χωρίς Λίστα

Χωρίς τίποτα να επαναληφθεί, το a for loop λειτουργεί σε όσα ορίσματα γραμμής εντολών είχαν παρασχεθεί στο σενάριο όταν κλήθηκε. Για παράδειγμα, εάν έχετε ένα σενάριο που ονομάζεται args.sh που περιέχει τα ακόλουθα:

#! / bin / sh
για ένα
κάνω
ηχώ $ a
Έγινε

Στη συνέχεια, η εκτέλεση του args.sh θα σας δώσει τα εξής:

$ ./args.sh ένα δύο τρία
ένας
δύο
τρία

Ο Bash αναγνωρίζει αυτήν την υπόθεση και αντιμετωπίζει για μια πράξη ως το ισοδύναμο του για $ @ do όπου το $ @ είναι μια ειδική μεταβλητή που αντιπροσωπεύει ορίσματα γραμμής εντολών.

Προσομοίωση ενός παραδοσιακού αριθμητικού για βρόχο

Τα σενάρια Bash ασχολούνται συχνά με λίστες αρχείων ή γραμμών εξόδου από άλλες εντολές, οπότε το for in in type loop είναι κοινό. Ωστόσο, υποστηρίζεται η παραδοσιακή λειτουργία τύπου c:

για ((i = 1; i <= 5; i ++))
κάνω
ηχώ $ i
Έγινε

Αυτή είναι η κλασική φόρμα με τρία μέρη στα οποία:

  1. μια μεταβλητή αρχικοποιείται (i = 1) όταν συναντάται ο βρόχος
  2. ο βρόχος συνεχίζεται αρκεί η συνθήκη (i <= 5) να ισχύει
  3. κάθε φορά γύρω από το βρόχο, η μεταβλητή αυξάνεται (i ++)

Η επανάληψη μεταξύ δύο τιμών είναι μια αρκετά κοινή προϋπόθεση ότι υπάρχει μια συντομότερη, ελαφρώς λιγότερο συγκεχυμένη εναλλακτική λύση:

για εγώ σε {1..5}
κάνω
ηχώ $ i
Έγινε

Η επέκταση στήριξης που πραγματοποιείται μεταφράζει αποτελεσματικά τα παραπάνω για βρόχο σε:

για i σε 1 2 3 4

Έλεγχος καλύτερου βρόχου με διακοπή και συνέχεια

Οι πιο περίπλοκοι για τους βρόχους χρειάζονται συχνά έναν τρόπο εξόδου νωρίς ή αμέσως επανεκκίνηση του κύριου βρόχου με την επόμενη τιμή με τη σειρά. Για να γίνει αυτό, ο bash δανείζεται το διάλειμμα και συνεχίζει τις δηλώσεις που είναι κοινές σε άλλες γλώσσες προγραμματισμού. Ακολουθεί ένα παράδειγμα που χρησιμοποιεί και τα δύο για να βρει το πρώτο αρχείο μήκους άνω των 100 χαρακτήρων:

#! / bin / bash
για αρχείο σε *
κάνω
αν [! -f "$ αρχείο"]
έπειτα
echo "Το αρχείο $ δεν είναι αρχείο"
να συνεχίσει
fi
num_chars = $ (wc -c Το αρχείο echo $ έχει "χαρακτήρες $ num_chars"
αν [$ num_chars -gt 100]
έπειτα
echo "Βρέθηκε $ αρχείο"
Διακοπή
fi
Έγινε

Το for loop εδώ λειτουργεί σε όλα τα αρχεία στον τρέχοντα κατάλογο. Εάν το αρχείο δεν είναι κανονικό αρχείο (π.χ. εάν είναι κατάλογος), η δήλωση συνέχισης χρησιμοποιείται για την επανεκκίνηση του βρόχου με το επόμενο αρχείο με τη σειρά. Εάν πρόκειται για κανονικό αρχείο, το δεύτερο μπλοκ υπό όρους θα καθορίσει εάν περιέχει περισσότερους από 100 χαρακτήρες. Εάν ναι, η δήλωση διακοπής χρησιμοποιείται για να αφήσει αμέσως το for for loop (και να φτάσει στο τέλος του σεναρίου).

συμπέρασμα

Ένα σενάριο bash είναι ένα αρχείο που περιέχει ένα σύνολο οδηγιών που μπορούν να εκτελεστούν. Το for for loop επιτρέπει την επανάληψη μέρους ενός σεναρίου πολλές φορές. Με τη χρήση μεταβλητών, εξωτερικών εντολών και των δηλώσεων διακοπής και συνέχισης, τα σενάρια bash μπορούν να εφαρμόσουν πιο σύνθετη λογική και να εκτελέσουν ένα ευρύ φάσμα εργασιών.

ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ
Οι ετικέτες απορρήτου της εφαρμογής της Apple ενδέχεται να μην είναι απόλυτα ακριβείς

Η αναφορά δείχνει ότι οι ετικέτες απορρήτου της εφαρμογής της Apple ενδέχεται να έχουν κάποια προβλήματα.

Σχετικά θέματα
  • Προγραμματισμός
  • Linux
Σχετικά με τον Συγγραφέα
Μπόμπι Τζακ (Δημοσιεύθηκαν 19 άρθρα)

Ο Bobby είναι λάτρης της τεχνολογίας που εργάστηκε ως προγραμματιστής λογισμικού για τις περισσότερες από δύο δεκαετίες. Είναι παθιασμένος με το gaming, εργάζεται ως Editor Editor στο Switch Player Magazine και είναι βυθισμένος σε όλες τις πτυχές των διαδικτυακών εκδόσεων και της ανάπτυξης ιστού.

Περισσότερα από τον Bobby Jack

Εγγραφείτε στο Newsletter μας

Εγγραφείτε στο ενημερωτικό δελτίο μας για τεχνικές συμβουλές, κριτικές, δωρεάν ebook και αποκλειστικές προσφορές!

Ένα ακόμη βήμα…!

Επιβεβαιώστε τη διεύθυνση email σας στο email που μόλις σας στείλαμε.

.