Όλα όσα πρέπει να γνωρίζετε για το Bash For Loops στο Linux

Όλα όσα πρέπει να γνωρίζετε για το Bash For Loops στο Linux

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





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





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

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





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

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



#!/bin/bash
echo 'Hello, World'

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

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

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





Αν δείτε τις λέξεις Hello, World εμφανίζονται τυπωμένες σε μια γραμμή στο τερματικό σας, τότε όλα λειτουργούν όπως απαιτείται.

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

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





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

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

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

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

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

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

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

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

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

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

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

πόσο κοστίζει το Kindle απεριόριστο
for file in one.c two.c three.c
do
ls '$file'
done

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

one.c
two.c
three.c

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

for file in *.xml
do
ls -l '$file'
done

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

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

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

$ ls -l *.xml

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

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

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

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

for file in *.xml
do
wc -l $file
done

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

44 feed.xml
231 sitemap.xml

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

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

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

for file in one.c two.c

Οχι έτσι:

for file in 'one.c two.c'

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

FILES='one.c two.c'
for file in $FILES
do
...
done

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

τι είναι το ταμείο δημιουργών tiktok

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

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

#!/bin/sh
for a
do
echo $a
done

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

$ ./args.sh one two three
one
two
three

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

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

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

for (( i=1; i<=5; i++ ))
do
echo $i
done

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

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

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

for i in {1..5}
do
echo $i
done

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

for i in 1 2 3 4

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

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

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

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

συμπέρασμα

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

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ Αξίζει την αναβάθμιση σε Windows 11;

Τα Windows έχουν επανασχεδιαστεί. Είναι όμως αυτό αρκετό για να σας πείσει να μεταβείτε από τα Windows 10 στα Windows 11;

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

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

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

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

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

Κάντε κλικ εδώ για εγγραφή