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

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

Ένα σενάριο, ή όπως ονομάζεται επίσης, ένα σενάριο, είναι μια ακολουθία εντολών που διαβάζονται και εκτελούνται με τη σειρά τους από ένα πρόγραμμα διερμηνέα, στην περίπτωσή μας είναι ένα πρόγραμμα γραμμής εντολών - bash.

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

Το απλούστερο παράδειγμα ενός σεναρίου για ένα κέλυφος Bash:

!/bin/bash
ηχώ "Γεια σου κόσμο"

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

!/usr/bin/env python
εκτύπωση ("Γεια σου κόσμο")

Ή σε PHP:

!/usr/bin/env php
ηχώ "Γεια σου κόσμο"?

Στην πρώτη περίπτωση, δείξαμε απευθείας το πρόγραμμα που θα εκτελέσει τις εντολές· στις δύο επόμενες, δεν γνωρίζουμε την ακριβή διεύθυνση του προγράμματος, οπότε ζητάμε από το env utility να το βρει με το όνομα και να το εκτελέσει. Αυτή η προσέγγιση χρησιμοποιείται σε πολλά σενάρια. Αλλά δεν είναι μόνο αυτό. Σε ένα σύστημα Linux, για να μπορέσει το σύστημα να εκτελέσει ένα σενάριο, πρέπει να ορίσετε την εκτελέσιμη σημαία στο αρχείο με αυτό.

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

Τρέχω:

chmod ugo+x script_file

Τώρα τρέχουμε το μικρό μας πρώτο πρόγραμμα:

./script_file

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

Μεταβλητές σε σενάρια

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

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

Για παράδειγμα, ας δηλώσουμε μια μεταβλητή συμβολοσειράς:

string="Γεια σου κόσμο"

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

Το σύμβολο $ χρησιμοποιείται για την εμφάνιση της τιμής μιας μεταβλητής. Για παράδειγμα:

Ας τροποποιήσουμε το σενάριό μας:

!/bin/bash
string1="γεια"
string2=κόσμος
string=$string1$string2
echo $string

Και ελέγχουμε:

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

!/bin/bash
string1="γεια"
string2=κόσμος
string=$string1$string2\ και\ εγώ
string3=$string1$string2" και εγώ"
echo $string3

Ελέγχουμε:

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

Μεταβλητές και έξοδος εντολών

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

$(ομάδα)

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

Καταλαβαίνεις? Ας γράψουμε ένα σενάριο όπου θα εμφανίζονται το hello world και η ημερομηνία:

string1="γεια σου κόσμε"
string2=$(ημερομηνία)

string=$string1$string2

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

Επιλογές σεναρίου

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

Η μεταβλητή με το όνομα 1 περιέχει την τιμή της πρώτης παραμέτρου, της μεταβλητής 2, της δεύτερης και ούτω καθεξής. Αυτό το σενάριο bash θα δώσει την τιμή της πρώτης παραμέτρου:

!/bin/bash
ηχώ $1

Κατασκευές ελέγχου σε σενάρια

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

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

εάν εντολή_συνθήκη
έπειτα
ομάδα
αλλού
ομάδα
fi

Αυτή η εντολή ελέγχει τον κωδικό εξόδου της εντολής συνθήκης και εάν το 0 (επιτυχία) τότε εκτελεί την εντολή ή πολλές εντολές μετά τη λέξη, τότε, εάν ο κωδικός εξόδου είναι 1, εκτελείται το μπλοκ else, το fi σημαίνει την ολοκλήρωση του μπλοκ του εντολές.

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

[[ παράμετρος 1 παράμετρος χειριστή 2 ]]

Για σύγκριση, χρησιμοποιούμε τους ήδη γνωστούς τελεστές<,>,=,!= και ούτω καθεξής. Εάν η έκφραση είναι αληθής, η εντολή θα επιστρέψει 0, αν όχι - 1. Μπορείτε να δοκιμάσετε τη συμπεριφορά της λίγο στο τερματικό. Ο κωδικός επιστροφής της τελευταίας εντολής αποθηκεύεται στη μεταβλητή $?:

Τώρα, συνδυάζοντας όλα αυτά, παίρνουμε ένα σενάριο με μια έκφραση υπό όρους:

!/bin/bash
εάν [[ $1 > 2 ]]
έπειτα
ηχώ $1" είναι μεγαλύτερη από 2"
αλλού
ηχώ $1" είναι μικρότερη από 2 ή 2"
fi

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

Βρόχοι σε σενάρια

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

Ας δούμε πρώτα τον βρόχο for. Εδώ είναι η σύνταξή του:

για μεταβλητή στη λίστα
κάνω
ομάδα
Ολοκληρώθηκε

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

Για παράδειγμα, ας επαναλάβουμε πάνω από πέντε ψηφία:

για ευρετήριο σε 1 2 3 4 5
κάνω
echo $index
Ολοκληρώθηκε

Ή μπορείτε να απαριθμήσετε όλα τα αρχεία στον τρέχοντα κατάλογο:

για αρχείο σε $(ls -l); κάντε echo "$file"? Ολοκληρώθηκε

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

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

ενώ συνθήκη εντολής
κάνω
ομάδα
Ολοκληρώθηκε

Εξετάστε ένα παράδειγμα:

!/bin/bash
ευρετήριο=1
ενώ [[ $index< 5 ]]
κάνω
echo $index
ας "index=index+1"
Ολοκληρώθηκε

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

Θα ήθελα να σημειώσω και κάτι άλλο. Κατασκευές όπως while, for, if έχουν σχεδιαστεί για να γράφονται σε πολλές γραμμές και αν προσπαθήσετε να τις γράψετε σε μία γραμμή, θα λάβετε ένα σφάλμα. Ωστόσο, είναι δυνατόν, για αυτό, όπου θα πρέπει να υπάρχει διάλειμμα γραμμής, βάλτε ένα ερωτηματικό ";". Για παράδειγμα, ο προηγούμενος βρόχος θα μπορούσε να είχε εκτελεστεί ως μία γραμμή:

ευρετήριο=1; ενώ [[ $index< 5 ]]; do echo $index; let "index=index+1"; done;

Όλα είναι πολύ απλά, προσπάθησα να μην περιπλέκω το άρθρο με πρόσθετους όρους και δυνατότητες bash, μόνο τα πιο βασικά. Σε ορισμένες περιπτώσεις, μπορεί να χρειαστεί να δημιουργήσετε ένα gui για ένα σενάριο bash και, στη συνέχεια, μπορείτε να χρησιμοποιήσετε προγράμματα όπως το zenity ή το kdialog, με τα οποία είναι πολύ βολικό να εμφανίζετε μηνύματα στον χρήστη και ακόμη και να του ζητάτε πληροφορίες.

συμπεράσματα

Τώρα καταλαβαίνετε τα βασικά του σεναρίου στο linux και μπορείτε να γράψετε το σενάριο που χρειάζεστε, για παράδειγμα, για δημιουργία αντιγράφων ασφαλείας. Προσπάθησα να δω τα σενάρια bash από την αρχή. Επομένως, δεν έχουν ληφθεί υπόψη όλες οι πτυχές. Ίσως θα επιστρέψουμε σε αυτό το θέμα σε ένα από τα ακόλουθα άρθρα.

Γράψιμο σεναρίων σε Linux (εκμάθηση με παραδείγματα)

———————————————————————————-

1. Εισαγωγή

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

Γιατί χρειάζονται σενάρια
Πρώτον, η διαχείριση ενός διακομιστή linux, στον ένα ή τον άλλο βαθμό, καταλήγει στη συστηματική εκτέλεση των ίδιων εντολών. Επιπλέον, δεν είναι απαραίτητο αυτές οι εντολές να εκτελούνται από ένα άτομο. Μπορούν να προγραμματιστούν ώστε να εκτελούνται από μηχανή.
Δεύτερον, ακόμα και το να κάνεις απλώς μια κανονική εργασία που (ξαφνικά) ανέρχεται σε 20-1000 ... επαναλαμβανόμενες πράξεις είναι ΠΟΛΥ πιο εύκολο να εφαρμοστεί σε ένα σενάριο.

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

Πώς να γράψετε ένα σενάριο
Στην περίπτωσή μας, το σενάριο θα είναι ένα αρχείο κειμένου με χαρακτηριστικά εκτέλεσης. Εάν ένα αρχείο σεναρίου ξεκινά με #!, το οποίο ονομάζεται sha-bang στον κόσμο του UNIX, αυτό λέει στο σύστημα ποιον διερμηνέα να χρησιμοποιήσει για να εκτελέσει το σενάριο. Εάν αυτό είναι δύσκολο να το καταλάβετε, τότε απλώς θυμηθείτε ότι θα αρχίσουμε να γράφουμε όλα τα σενάρια με τη γραμμή #!/bin/bash ή #!/bin/sh, και στη συνέχεια θα φύγουν οι εντολές και τα σχόλια σε αυτά.

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

Τι σενάρια μπορεί να χρειαστούμε:

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

Σχετικά με την τεχνική του σεναρίου
Δημιουργούμε ένα αρχείο κειμένου, το επεξεργαζόμαστε, ορίζουμε δικαιώματα εκτέλεσης, το εκτελούμε, ελέγχουμε σφάλματα, το διορθώνουμε, το εκτελούμε, ελέγχουμε σφάλματα ...
Όταν όλα γλείφονται και λειτουργούν σωστά, τα βάζουμε σε autoload ή στον προγραμματιστή για συγκεκριμένο χρόνο.

———————————————————————————-

2. Εκμάθηση γραφής σεναρίων στην εσωτερική γλώσσα BASH
πρωτότυπο: https://www.linuxconfig.org/Bash_scripting_Tutorial

Αυτός ο οδηγός δεν προϋποθέτει καμία προηγούμενη γνώση του τρόπου σύνταξης σεναρίων (εφεξής καλούμενα σενάρια) χρησιμοποιώντας την εσωτερική γλώσσα Bash. Με τη βοήθεια αυτού του οδηγού, σύντομα θα ανακαλύψετε ότι η συγγραφή σεναρίων είναι μια πολύ εύκολη δουλειά. Ας ξεκινήσουμε το σεμινάριο μας με ένα απλό σενάριο που εκτυπώνει τη συμβολοσειρά "Hello World!" (μετάφραση από τα αγγλικά - Γεια σε όλους!)

1. Σενάριο "Γεια σε όλους"
Ακολουθεί το πρώτο σας παράδειγμα σεναρίου bash:

#!/bin/bash
echo "Hello World"

Αλλάξτε στον κατάλογο που περιέχει το αρχείο μας hello_world.sh και κάντε το εκτελέσιμο:

Κωδικός: Επιλέξτε όλα $ chmod +x hello_world.sh

Εκτελέστε το σενάριο για εκτέλεση

Κωδικός: Επιλέξτε όλα τα $ ./hello_world.sh

2. Ένα απλό σενάριο αρχειοθέτησης bash

#!/bin/bash
tar -czf myhome_directory.tar.gz /home/user

Κωδικός: Επιλέξτε όλα τα $ ./backup.sh

$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz

3. Εργασία με μεταβλητές
Σε αυτό το παράδειγμα, δηλώνουμε μια απλή μεταβλητή και την εμφανίζουμε στην οθόνη χρησιμοποιώντας την εντολή echo.

#!/bin/bash
STRING="ΓΕΙΑ ΣΟΥ ΚΟΣΜΟ!!!"
ηχώ $STRING

Κωδικός: Επιλέξτε όλα τα $ ./hello_world.sh
ΓΕΙΑ ΣΟΥ ΚΟΣΜΕ!!!

Το σενάριο αρχειοθέτησής μας με μεταβλητές:

#!/bin/bash
OF=myhome_directory_$(ημερομηνία +%Y%m%d).tar.gz
IF=/home/user
tar -czf $OF $IF

Κωδικός: Επιλέξτε όλα τα $ ./backup.sh
tar: Αφαίρεση του αρχικού "\" από τα ονόματα μελών
$ du -sh *tar.gz
41M myhome_directory_20100123.tar.gz

3.1 Καθολικές και τοπικές μεταβλητές

#!/bin/bash
# Δηλώστε μια καθολική μεταβλητή
# Αυτή η μεταβλητή μπορεί να χρησιμοποιηθεί οπουδήποτε σε αυτό το σενάριο
VAR = "παγκόσμια μεταβλητή"
λειτουργία bash(
# Δηλώστε μια τοπική μεταβλητή
# Μια τέτοια μεταβλητή ισχύει μόνο για τη συνάρτηση στην οποία έχει δηλωθεί
local VAR = "τοπικές μεταβλητές"
echo $VAR
}
echo $VAR
κτυπώ δυνατά
# Σημειώστε ότι η καθολική μεταβλητή δεν έχει αλλάξει
echo $VAR

Κωδικός: Επιλέξτε όλα τα $ ./variables.sh
καθολική μεταβλητή
τοπική μεταβλητή
καθολική μεταβλητή

4. Μετάδοση επιχειρημάτων στο σενάριο

#!/bin/bash
# Χρησιμοποιήστε προκαθορισμένες μεταβλητές για πρόσβαση σε ορίσματα
# Εκτύπωση ορισμάτων στην οθόνη
echo $1 $2 $3 " -> echo $1 $2 $3"

#Μπορούμε επίσης να έχουμε πρόσβαση στα ορίσματα μέσω ενός ειδικού πίνακα args=(" [email προστατευμένο]»)
# Εκτύπωση ορισμάτων στην οθόνη
echo $(args) $(args) $(args) ‘ -> args=(“ [email προστατευμένο]»); ηχώ $(args) $(args) $(args)'

# Χρησιμοποιήστε μια μεταβλητή [email προστατευμένο]για να εμφανιστούν όλα τα ορίσματα ταυτόχρονα
ηχώ [email προστατευμένο]' -> ηχώ [email προστατευμένο]

Χρησιμοποιήστε τη μεταβλητή $# για να εμφανίσετε τον αριθμό των ορισμάτων που μεταβιβάστηκαν στο σενάριο
echo Αριθμός ορισμάτων που πέρασαν: $# ‘ -> echo Αριθμός ορισμάτων που πέρασαν: $#’

Κωδικός: Επιλέξτε όλα τα $ ./arguments.sh Bash Scripting Tutorial
Οδηγός δέσμης ενεργειών Bash -> echo $1 $2 $3
Εκμάθηση σεναρίων Bash -> args=(" [email προστατευμένο]"); echo $(args) $(args) $(args)
Οδηγός σεναρίου Bash -> echo [email προστατευμένο]
Αριθμός ορισμάτων που πέρασαν: 3 -> echo Αριθμός ορισμάτων που πέρασαν: $#

5. Εκτέλεση εντολών Shell σε σενάριο

#!/bin/bash
# χρησιμοποιήστε backticks » ` ` » για να εκτελέσετε μια εντολή φλοιού
ηχώ `unname -o`
# τώρα ας προσπαθήσουμε χωρίς εισαγωγικά
ηχώ uname -ο

Κωδικός: Επιλέξτε όλα τα $ uname -o
GNU/Linux
$ ./bash_backtricks.sh
GNU/Linux
ονόμα-ο

Όπως μπορείτε να δείτε, στη δεύτερη περίπτωση, εμφανίστηκε η ίδια η εντολή και όχι το αποτέλεσμα της εκτέλεσής της.

6. Ανάγνωση εισόδου χρήστη (διαδραστικότητα)

#!/bin/bash
echo -e "Γεια, πληκτρολογήστε τη λέξη: \c"
διαβάστε λέξη
echo "Η λέξη που εισαγάγατε είναι: $word"
echo -e «Μπορείς σε παρακαλώ να εισάγεις δύο λέξεις; »
διαβάστε λέξη1 λέξη2
echo "Εδώ είναι η εισαγωγή σας: \"$word1\" \"$word2\""
echo -e «Πώς αισθάνεσαι για το bash scripting; »
Η # εντολή read αποθηκεύει τώρα μια απάντηση στην προεπιλεγμένη ενσωματωμένη μεταβλητή $REPLY
ανάγνωση
echo "Είπες $REPLY, χαίρομαι που το ακούω! »
echo -e «Ποια είναι τα αγαπημένα σου χρώματα; »
# -a κάνει την εντολή ανάγνωσης για ανάγνωση σε έναν πίνακα
διάβασε -α χρώματα
echo "Τα αγαπημένα μου χρώματα είναι επίσης $(colours), $(colours) και $(colours):-)"

Κωδικός: Επιλέξτε όλα τα $ ./read.sh
Γεια, πληκτρολογήστε τη λέξη: κάτι
Η λέξη που εισαγάγατε είναι: κάτι
Μπορείτε να εισάγετε δύο λέξεις;
Debian Linux
Εδώ είναι η εισαγωγή σας: "Debian" "Linux"
Πώς νιώθετε για το bash scripting;
Καλός
Καλά τα είπες, χαίρομαι που το ακούω!
Ποια είναι τα αγαπημένα σας χρώματα;
μπλε πράσινο μαύρο
Τα αγαπημένα μου χρώματα είναι επίσης το μπλε, το πράσινο και το μαύρο :-)

7. Χρήση της παγίδας

#!/bin/bash
# δηλώστε παγίδα
παγίδα bashtrap ΙΝΤ
# καθαρίστε την οθόνη
Σαφή;
# η λειτουργία hook εκτελείται όταν ο χρήστης πατήσει CTRL-C:
# Θα εμφανιστεί => Εκτέλεση υπορουτίνας bash trap !
# αλλά το σενάριο θα συνεχίσει να εκτελείται
bashtrap()
{
echo "Εντοπίστηκε CTRL+C!…εκτέλεση bash trap!"
}
# το σενάριο θα μετρήσει μέχρι το 10
για ένα σε `seq 1 10`; κάνω
echo "$a/10 to Exit."
ύπνος1;
Ολοκληρώθηκε
echo "Exit Bash Trap Example!!!"

Κωδικός: Επιλέξτε όλα τα $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL+C Εντοπίστηκε !...εκτέλεση bash trap !
10/10
Παράδειγμα Exit Bash Trap!!!

Όπως μπορείτε να δείτε, ο συνδυασμός πλήκτρων Ctrl-C δεν σταμάτησε την εκτέλεση του σεναρίου.

8. Πίνακες
8.1 Δήλωση ενός απλού πίνακα

#!/bin/bash
# Δηλώστε έναν απλό πίνακα με 4 στοιχεία
ARRAY=('Debian Linux' 'Redhat Linux' Ubuntu Linux)
# Λάβετε τον αριθμό των στοιχείων στον πίνακα
ΣΤΟΙΧΕΙΑ=$(#ΣΥΝΑΛΗ[@])

# βρόχος μέσα από κάθε στοιχείο του πίνακα
για ((i=0;i<$ELEMENTS;i++)); do
echo $(ARRAY[$(i)])
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $./arrays.sh
Debian Linux
redhat linux
ubuntu
linux

8.2 Συμπλήρωση πίνακα με τιμές από αρχείο

#!/bin/bash
# Δηλώστε έναν πίνακα
δηλώνω -a ARRAY
# εντολή exec Από αυτό το αρχείο θα δημιουργηθεί # stdin (συνήθως το πληκτρολόγιο). Αυτό καθιστά δυνατή την ανάγνωση
# τα περιεχόμενα του αρχείου, γραμμή προς γραμμή, και αναλύστε κάθε γραμμή που εισάγεται με sed και/ή awk.
εκτελεστικό 10 letcount=0

ενώ διαβάζετε LINE<&10; do

ΠΙΝΑΚΑΣ[$count]=$LINE
((μέτρηση++))
Ολοκληρώθηκε

echo Αριθμός στοιχείων: $(#ARRAY[@])
# Εμφάνιση τιμών πίνακα
echo $(ARRAY[@])
# κλείσιμο του αρχείου
exec 10>&-

Κωδικός: Επιλέξτε όλα τα $ cat bash.txt
Debian Linux
redhat linux
ubuntu
linux
$ ./arrays.sh
Αριθμός στοιχείων: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Εάν-τότε-άλλο συνθήκες
9.1. Απλή χρήση των συνθηκών «αν-άλλο».
Δώστε προσοχή στους χώρους σε αγκύλες, χωρίς τους οποίους η συνθήκη δεν θα λειτουργήσει.

#!/bin/bash
directory="./BashScripting"

# ελέγξτε αν υπάρχει ο κατάλογος
εάν [ -d $directory ]; έπειτα
echo "Ο κατάλογος υπάρχει"
αλλού
echo "Ο κατάλογος δεν υπάρχει"
fi

Κωδικός: Επιλέξτε όλα τα $ ./if_else.sh
Ο κατάλογος δεν υπάρχει
$ mkdir BashScripting
$ ./if_else.sh
Ο κατάλογος υπάρχει

9.2 Ένθετες συνθήκες if-else

#!/bin/bash
# Δηλώστε μια μεταβλητή με τιμή 4
επιλογή=4
# Απεικόνιση
ηχώ «1. κτυπώ δυνατά"
ηχώ «2. Σενάριο»
ηχώ «3. Φροντιστήριο"

# Εκτελέστε ενώ η μεταβλητή είναι ίση με τέσσερα
# βρόχος
ενώ [ $choice -eq 4 ]; κάνω

# ανάγνωση εισόδου χρήστη
διαβάστε την επιλογή
# ένθετη συνθήκη "if-else".
if [ $choice -eq 1 ] ; έπειτα

echo "Έχετε επιλέξει λέξη: Bash"

if [ $choice -eq 2 ] ; έπειτα
echo "Έχετε επιλέξει λέξη: Σενάριο"
αλλού

if [ $choice -eq 3 ] ; έπειτα
echo "Έχετε επιλέξει λέξη: Εκμάθηση"
αλλού
echo "Παρακαλώ κάντε μια επιλογή μεταξύ 1-3!"
ηχώ «1. κτυπώ δυνατά"
ηχώ «2. Σενάριο»
ηχώ «3. Φροντιστήριο"
echo -n "Παρακαλώ επιλέξτε μια λέξη; »
επιλογή=4
fi
fi
fi
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ./nested.sh
1. μπας
2. Σενάριο
3. Φροντιστήριο

5

1. μπας
2. Σενάριο
3. Φροντιστήριο
Παρακαλώ επιλέξτε μια λέξη
4
Κάντε μια επιλογή μεταξύ 1-3!
1. μπας
2. Σενάριο
3. Φροντιστήριο
Παρακαλώ επιλέξτε μια λέξη
3
Έχετε επιλέξει λέξη: Tutorial

Έτσι, πρώτα εκτελείται το σώμα του βρόχου "while", γιατί η μεταβλητή επιλογή ορίζεται αρχικά σε τέσσερα. Στη συνέχεια διαβάζουμε την είσοδο του χρήστη σε αυτό και αν η είσοδος δεν είναι ίση με 1,2 ή 3, τότε κάνουμε τη μεταβλητή μας ίση με 4 ξανά, σε σχέση με την οποία το σώμα του βρόχου επαναλαμβάνεται (πρέπει να εισαγάγετε ξανά 1,2 ή 3).

10. Συγκρίσεις
10.1 Αριθμητικές συγκρίσεις

Lt<
-gt>
-le<=
-ge >=
-eq ==
-νε !=

#!/bin/bash

NUM1=2
NUM2=2
εάν [ $NUM1 -eq $NUM2 ]; έπειτα
echo "Και οι δύο αξίες είναι ίσες"
αλλού
ηχώ "Οι αξίες ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./equals.sh
Και οι δύο αξίες είναι ίσες

#!/bin/bash
# Δηλώστε μεταβλητές με ακέραιες τιμές
NUM1=2
NUM2=3
εάν [ $NUM1 -eq $NUM2 ]; έπειτα
echo "Και οι δύο αξίες είναι ίσες"
αλλού
ηχώ "Οι αξίες ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./equals.sh
Οι αξίες ΔΕΝ είναι ίσες

#!/bin/bash
# Δηλώστε μεταβλητές με ακέραιες τιμές
NUM1=2
NUM2=1
εάν [ $NUM1 -eq $NUM2 ]; έπειτα
echo "Και οι δύο αξίες είναι ίσες"
elif [ $NUM1 -gt $NUM2 ]; έπειτα
ηχώ "$NUM1 είναι μεγαλύτερο από $NUM2"
αλλού
ηχώ "$NUM2 είναι μεγαλύτερο από $NUM1"
fi

Κωδικός: Επιλέξτε όλα τα $ ./equals.sh
Το 2 είναι μεγαλύτερο από το 1

10.2 Συγκρίσεις χαρακτήρων-κειμένου

Το ίδιο
!= όχι το ίδιο
< меньще чем
> περισσότερο από
-n s1 μεταβλητή s1 δεν είναι κενή
-z s1 μεταβλητή s1 είναι κενή

#!/bin/bash

S1="Bash"

S2="Scripting"
εάν [ $S1 = $S2 ]; έπειτα

αλλού
echo "Οι χορδές ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./statement.sh
Οι χορδές ΔΕΝ είναι ίσες

#!/bin/bash
# Δηλώστε τη συμβολική μεταβλητή S1
S1="Bash"
# Δηλώστε τη συμβολική μεταβλητή S2
S2="Bash"
εάν [ $S1 = $S2 ]; έπειτα
echo "Και οι δύο χορδές είναι ίσες"
αλλού
echo "Οι χορδές ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./statement.sh
Και οι δύο χορδές είναι ίσες

11. Έλεγχος αρχείων

Όνομα αρχείου B Αποκλεισμός ειδικού αρχείου
-c όνομα αρχείου Αρχείο ειδικού χαρακτήρα
-d όνομα καταλόγου Έλεγχος ύπαρξης καταλόγου
-e όνομα αρχείου Έλεγχος ύπαρξης αρχείου
-f όνομα αρχείου Ελέγξτε για κανονική ύπαρξη αρχείου και όχι καταλόγου
-Όνομα αρχείου G Ελέγξτε εάν το αρχείο υπάρχει και ανήκει σε πραγματικό αναγνωριστικό ομάδας.
-g όνομα αρχείου true αν υπάρχει αρχείο και είναι set-group-id.
-k όνομα αρχείου Sticky bit
-L όνομα αρχείου Συμβολικός σύνδεσμος
-O όνομα αρχείου True αν υπάρχει αρχείο και ανήκει στο πραγματικό αναγνωριστικό χρήστη.
-r όνομα αρχείου Ελέγξτε εάν το αρχείο είναι αναγνώσιμο
-S filename Ελέγξτε εάν το αρχείο είναι υποδοχή
Όνομα αρχείου -s Ελέγξτε εάν το μέγεθος του αρχείου δεν είναι μηδενικό
-u όνομα αρχείου Ελέγξτε αν έχει οριστεί το bit αρχείου set-ser-id
-w όνομα αρχείου Ελέγξτε εάν το αρχείο είναι εγγράψιμο
-x όνομα αρχείου Ελέγξτε εάν το αρχείο είναι εκτελέσιμο

#!/bin/bash
file="./file"
εάν [ -e $file ]; έπειτα
echo "Το αρχείο υπάρχει"
αλλού
echo "Το αρχείο δεν υπάρχει"
fi

Κωδικός: Επιλέξτε όλα τα $ ls
αρχείο.sh
$ ./file.sh
Το αρχείο δεν υπάρχει
$ αρχείο αφής
$ls
αρχείο file.sh
$ ./file.sh
Το αρχείο υπάρχει

Ομοίως για το παράδειγμα μπορούμε να χρησιμοποιήσουμε τον βρόχο "while" για να ελέγξουμε αν το αρχείο δεν υπάρχει. Αυτό το σενάριο θα αδράνει μέχρι να υπάρξει το αρχείο. Σημειώστε το αρνητικό Bash "!" που αναιρεί (αναστρέφει) την επιλογή -e.

12. Κύκλοι
12.1. Για βρόχο

#!/bin/bash
# για βρόχο
για f σε $(ls /var/); κάνω
ηχώ $f
Ολοκληρώθηκε

Εκτέλεση ενός βρόχου for από τη γραμμή εντολών bash:

Κωδικός: Επιλέξτε όλα τα $ για f σε $(ls /var/); κάνω echo $f; done Code: Επιλέξτε όλα τα $ για f σε $(ls /var/); κάνω echo $f; Ολοκληρώθηκε
αντίγραφα ασφαλείας
κρύπτη
σύγκρουση
Παιχνίδια
lib
τοπικός
κλειδαριά
κούτσουρο
ταχυδρομείο
επιλέγω
τρέξιμο
πηνίο
tmp
www

12.2. ενώ βρόχος

#!/bin/bash
COUNT=6
βρόχος # while
ενώ [ $COUNT -gt 0 ]; κάνω

ας COUNT=COUNT-1
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ./while_loop.sh
Η τιμή της καταμέτρησης είναι: 6
Η τιμή της καταμέτρησης είναι: 5
Η τιμή της καταμέτρησης είναι: 4
Η τιμή της καταμέτρησης είναι: 3
Η τιμή της καταμέτρησης είναι: 2
Η τιμή της καταμέτρησης είναι: 1

12.3. μέχρι βρόχου

#!/bin/bash
COUNT=0
#έως βρόχο
έως [ $COUNT -gt 5 ]; κάνω
echo Η τιμή του πλήθους είναι: $COUNT
ας COUNT=COUNT+1
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ./until_loop.sh
Η τιμή της καταμέτρησης είναι: 0
Η τιμή της καταμέτρησης είναι: 1
Η τιμή της καταμέτρησης είναι: 2
Η τιμή της καταμέτρησης είναι: 3
Η τιμή της καταμέτρησης είναι: 4
Η τιμή της καταμέτρησης είναι: 5

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

#!/bin/bash
# Αυτό το σενάριο θα βρει και θα αφαιρέσει κενά
# σε αρχεία, αντικαθιστώντας τα με υπογράμμιση
DIR="."
Έλεγχος του βρόχου με την εντολή ανάγνωσης ανακατευθύνοντας την έξοδο στον βρόχο.
βρείτε $DIR -τύπος f | κατά την ανάγνωση του αρχείου? κάνω
# χρησιμοποιήστε την κλάση POSIX [:space:] για να βρείτε κενά στα ονόματα αρχείων
εάν [[ "$file" = *[[:space:]]* ]]; έπειτα
# αντικαταστήστε τα κενά με υπογράμμιση
mv "$file" `echo $file | tr ‘‘‘_’’
fi;
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ls -1
σενάριο.sh
$ αγγίξτε "αρχείο με κενά"
$ ls -1
αρχείο με κενά
σενάριο.sh
$ ./script.sh
$ ls -1
file_with_space
σενάριο.sh

13. Λειτουργίες

#!/bin/bash
# Οι συναρτήσεις μπορούν να δηλωθούν με οποιαδήποτε σειρά
συνάρτηση συνάρτηση_Β(
ηχώ Λειτουργία Β.
}
συνάρτηση συνάρτηση_A(
ηχώ $1
}
συνάρτηση συνάρτηση_D(
echo Λειτουργία D.
}
συνάρτηση_C(
ηχώ $1
}
# Λειτουργίες κλήσης
# περάστε την παράμετρο στη συνάρτηση Α
function_A "Συνάρτηση Α."
συνάρτηση_Β
# περάστε την παράμετρο στη συνάρτηση C
function_C "Συνάρτηση C."
συνάρτηση_Δ

Κωδικός: Επιλέξτε όλα τα $ ./functions.sh
Λειτουργία Α.
Λειτουργία Β.
Λειτουργία Γ.
Συνάρτηση Δ.

14. Επιλογή χειριστή - Επιλογή

#!/bin/bash
PS3='Επιλέξτε μία λέξη:'
# επιλέξτε
επιλέξτε λέξη στο "linux" "bash" "scripting" "tutorial"
κάνω
echo "Η λέξη που επιλέξατε είναι: $word"
# Σπάστε, διαφορετικά ο βρόχος θα είναι άπειρος.
Διακοπή
Ολοκληρώθηκε
έξοδος 0

Κωδικός: Επιλέξτε όλα τα $ ./select.sh
1) linux
2) μπας
3) σενάριο
4) φροντιστήριο
Επιλέξτε μία λέξη: 4
Η λέξη που επιλέξατε είναι: tutorial

15. Χειριστής επιλογής - Περίπτωση

#!/bin/bash
echo "Ποια είναι η προτιμώμενη γλώσσα προγραμματισμού/σεναρίου"
ηχώ "1) bash"
echo "2) perl"
echo "3) phyton"
ηχώ "4) c++"
ηχώ "5) Δεν ξέρω!"
ανάγνωση περίπτωση?
# μια απλή δομή επιλογής περίπτωσης
# σημειώστε ότι σε αυτό το παράδειγμα η $case είναι απλώς μια μεταβλητή
# και δεν χρειάζεται να λέγεται έτσι. Αυτό είναι απλώς ένα παράδειγμα
$case in
1) echo "Επιλέξατε το bash";;
2) echo "Επιλέξατε την perl";;
3) echo "Επιλέξατε φυτό";;
4) echo "Επιλέξατε c++";;
5) έξοδος
esac

Κωδικός: Επιλέξτε όλα τα $ ./case.sh
Ποια είναι η γλώσσα προγραμματισμού/σεναρίου που προτιμάτε
1) μπας
2) perl
3) φυτών
4) c++
5) Δεν ξέρω!
4
Επιλέξατε c++

———————————————————————————-

Περισσότερες λεπτομερείς πληροφορίες μπορείτε να λάβετε από διάφορες πηγές, για παράδειγμα εδώ
πρωτότυπο: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin … -book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296

Φυσικά, όλοι όσοι επικοινωνούν με το Linux OS τουλάχιστον μία φορά έχουν ασχοληθεί (τουλάχιστον άκουσαν σίγουρα) με το κέλυφος εντολών BASH. Αλλά το BASH δεν είναι μόνο ένα κέλυφος εντολών, είναι επίσης μια εξαιρετική γλώσσα προγραμματισμού σεναρίων.
Ο σκοπός αυτού του άρθρου είναι να εισαγάγει τους χρήστες πιο κοντά στο bash, να μιλήσει για τη σύνταξη, τα βασικά κόλπα και τα χαρακτηριστικά της γλώσσας, έτσι ώστε ακόμη και ένας απλός χρήστης να μπορεί να γράψει γρήγορα ένα απλό σενάριο για να εκτελέσει καθημερινή (-εβδομαδιαία, -μηνιαία) εργασία ρουτίνας ή, ας πούμε, "στο γόνατο» Δημιουργήστε ένα σενάριο για να δημιουργήσετε αντίγραφα ασφαλείας του καταλόγου.

Εισαγωγή

BASH - Bourne-Again SHell (το οποίο μπορεί να μεταφραστεί ως "reborn shell", ή "Bourne-Again SHell again"), ο πιο δημοφιλής διερμηνέας εντολών σε συστήματα που μοιάζουν με Unix, ειδικά στο GNU/Linux. Παρακάτω είναι ένας αριθμός ενσωματωμένων εντολών που θα χρησιμοποιήσουμε για να δημιουργήσουμε τα σενάρια μας.

Διακοπή εξόδου από βρόχο for, while ή μέχρι
συνεχίζει εκτελεί την επόμενη επανάληψη του βρόχου for, while ή μέχρι
ορίσματα εκτύπωσης echo διαχωρισμένα με χώρο σε τυπική έξοδο
έξοδος έξοδος από το κέλυφος
Η εξαγωγή επισημαίνει ορίσματα ως μεταβλητές που πρέπει να μεταβιβαστούν σε θυγατρικές διεργασίες στο περιβάλλον
Ο κατακερματισμός θυμάται τα πλήρη ονόματα διαδρομών των εντολών που δίνονται ως ορίσματα, έτσι ώστε να μην αναζητούνται την επόμενη φορά που θα κληθούν
Το kill στέλνει ένα σήμα τερματισμού σε μια διεργασία
Το pwd εμφανίζει τον τρέχοντα κατάλογο εργασίας
Η ανάγνωση διαβάζει μια γραμμή από την είσοδο φλοιού και τη χρησιμοποιεί για να εκχωρήσει τιμές στις καθορισμένες μεταβλητές.\
επιστροφή προκαλεί την έξοδο της συνάρτησης φλοιού με την καθορισμένη τιμή
Το shift μετακινεί τις παραμέτρους θέσης προς τα αριστερά
Το τεστ αξιολογεί την υπό όρους έκφραση
Times εκτυπώνει το όνομα χρήστη και την ώρα του συστήματος που χρησιμοποιείται από το κέλυφος και τους απογόνους του
trap καθορίζει τις εντολές που πρέπει να εκτελεστούν όταν το κέλυφος λαμβάνει ένα σήμα
unset προκαλεί την καταστροφή μεταβλητών φλοιού
περιμένει περιμένει την έξοδο της θυγατρικής διαδικασίας και αναφέρει την κατάσταση εξόδου.

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

Τι πρέπει να γνωρίζετε από την αρχή

1. Οποιοδήποτε σενάριο bash πρέπει να ξεκινά με τη γραμμή:

#!/bin/bash
σε αυτή τη γραμμή μετά το #! η διαδρομή προς τον διερμηνέα bash έχει καθοριστεί, οπότε αν τον έχετε εγκαταστήσει αλλού (όπου, μπορείτε να μάθετε πληκτρολογώντας Whereis bash) αλλάξτε τον στη διαδρομή σας.
2. Τα σχόλια ξεκινούν με το σύμβολο # (εκτός από την πρώτη γραμμή).
3. Στο bash, οι μεταβλητές δεν έχουν τύπο (θα συζητηθούν παρακάτω)

Μεταβλητές σεναρίου και παράμετροι

Επιτρέψτε μου να σας δώσω ένα μικρό παράδειγμα που θα αναλύσουμε:

#!/bin/bash
# καθορίστε πού αποθηκεύουμε τον διερμηνέα bash
parametr1=$1 #ορίστε τη μεταβλητή parametr1 στην τιμή της πρώτης παραμέτρου του σεναρίου
script_name=$0 #ορίστε τη μεταβλητή script_name στην τιμή του ονόματος του σεναρίου
echo "Έχετε εκτελέσει μια δέσμη ενεργειών με το όνομα $script_name και την παράμετρο $parametr1" # η εντολή echo εξάγει μια συγκεκριμένη συμβολοσειρά, η πρόσβαση στις μεταβλητές γίνεται μέσω $variable_name.
echo "Έχετε τρέξει ένα σενάριο με το όνομα $script_name με την παράμετρο $parametr1" # εδώ βλέπουμε άλλα εισαγωγικά, η διαφορά είναι ότι δεν υπάρχει αντικατάσταση μεταβλητής σε μεμονωμένα εισαγωγικά.
έξοδος 0 #Έξοδος με κωδικό 0 (επιτυχής ολοκλήρωση του σεναρίου)

[email προστατευμένο]:~$ ./test.sh qwerty
Έχετε εκτελέσει ένα σενάριο με το όνομα ./test.sh με την παράμετρο qwerty
Έχετε εκτελέσει ένα σενάριο με το όνομα $script_name και την παράμετρο $parametr1

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

$DIRSTACK - τα περιεχόμενα της κορυφής της στοίβας καταλόγου
$EDITOR - προεπιλεγμένο πρόγραμμα επεξεργασίας κειμένου
$EUID - Αποτελεσματικό UID. Εάν χρησιμοποιήσατε το πρόγραμμα su για να εκτελέσετε εντολές ως άλλος χρήστης, τότε αυτή η μεταβλητή περιέχει το UID αυτού του χρήστη, ενώ...
Το $UID - ...περιέχει το πραγματικό αναγνωριστικό, το οποίο ορίζεται μόνο κατά τη σύνδεση.
$FUNCNAME - το όνομα της τρέχουσας συνάρτησης στο σενάριο.
$GROUPS - πίνακας ομάδων στις οποίες ανήκει ο τρέχων χρήστης
$HOME - αρχικός κατάλογος χρήστη
$HOSTNAME - το όνομα του κεντρικού υπολογιστή σας
$HOSTTYPE - αρχιτεκτονική κεντρικού υπολογιστή.
$LC_CTYPE - εσωτερική μεταβλητή που καθορίζει την κωδικοποίηση χαρακτήρων
$OLDPWD - παλιός κατάλογος εργασίας
$OSTYPE - Τύπος λειτουργικού συστήματος
$PATH - διαδρομή αναζήτησης προγράμματος
$PPID - αναγνωριστικό γονικής διαδικασίας
$SECONDS - χρόνος εκτέλεσης σεναρίου (σε δευτερόλεπτα)
$# - συνολικός αριθμός παραμέτρων που μεταβιβάστηκαν στο σενάριο
$* - όλα τα ορίσματα μεταβιβάστηκαν στο σενάριο (εμφανίζονται σε μια συμβολοσειρά)
[email προστατευμένο]- το ίδιο με το προηγούμενο, αλλά οι παράμετροι εμφανίζονται σε μια στήλη
$! - PID της τελευταίας διεργασίας που εκτελείται στο παρασκήνιο
$$ - PID του ίδιου του σεναρίου

Οροι

Οι τελεστές υπό όρους, νομίζω, είναι εξοικειωμένοι σχεδόν σε όλους όσους έχουν προσπαθήσει ποτέ να γράψουν προγράμματα σε κάτι. Στο bash, οι συνθήκες γράφονται ως εξής. τρόπο (όπως συνήθως στο παράδειγμα):
#!/bin/bash
source=$1 # τοποθετήστε την πρώτη παράμετρο του σεναρίου στη μεταβλητή πηγή
dest=$2 #βάλτε τη δεύτερη παράμετρο του σεναρίου στη μεταβλητή dest

Εάν [[ "$source" -eq "$dest" ]] # παραθέστε ονόματα μεταβλητών για σύγκριση. -eq - λογική σύγκριση που δηλώνει "ίσο"
τότε # αν είναι πραγματικά ίσα, τότε
echo "Ο προορισμός $dest και η πηγή $source είναι το ίδιο αρχείο!" #εμφάνιση μηνύματος σφάλματος, επειδή Το $source και το $dest είναι ίσα
έξοδος 1 # έξοδος με σφάλμα (1 - κωδικός σφάλματος)
αλλιώς # αν δεν είναι ίσα
cp $source $dest # και, στη συνέχεια, εκτελέστε την εντολή cp: αντιγράψτε την πηγή στον προορισμό
echo "Επιτυχημένη αντιγραφή!"
fi #δηλώνει το τέλος της συνθήκης.

Αποτέλεσμα εκτέλεσης σεναρίου:
[email προστατευμένο]:~$ ./primer2.sh 1 1
Ο αιτών 1 και η πηγή 1 είναι το ίδιο αρχείο!
[email προστατευμένο]:~$ ./primer2.sh 1 2
Καλή αντιγραφή!

Η δομή if-then-else χρησιμοποιείται ως εξής:
αν<команда или набор команд возвращающих код возврата(0 или 1)>
έπειτα
<если выражение после if истино, то выполняется этот блок>
αλλού
<если выражение после if ложно, тот этот>
Οι δομές [[ , [ , test, (()) ή οποιαδήποτε άλλη (ή πολλές) εντολή linux μπορούν να λειτουργήσουν ως εντολές που επιστρέφουν έναν κωδικό επιστροφής.
δοκιμή - χρησιμοποιείται για λογική σύγκριση. Μετά την έκφραση, απαιτείται μια αγκύλη "]".
Το [ είναι συνώνυμο της εντολής δοκιμής
[[ - εκτεταμένη έκδοση του "[" (από την έκδοση 2.02) (όπως στο παράδειγμα), εντός της οποίας || (ή), & (και). Πρέπει να έχει μια αγκύλα "]]"
(()) - μαθηματική σύγκριση.
για τη δημιουργία πολυεπίπεδων συνθηκών της φόρμας:
αν ...
έπειτα ....
αλλού
αν ....
έπειτα....
αλλο....

Για συντομία και αναγνωσιμότητα του κώδικα, μπορείτε να χρησιμοποιήσετε τη δομή:
αν..
έπειτα...
ελιφ...
έπειτα...
ελιφ...

Οροι. Πολλαπλή επιλογή

Εάν είναι απαραίτητο να συγκρίνετε οποιαδήποτε μεταβλητή με μεγάλο αριθμό παραμέτρων, τότε είναι πιο σκόπιμο να χρησιμοποιήσετε τη δήλωση case.
#!/bin/bash
echo "Επιλέξτε έναν επεξεργαστή για εκτέλεση:"
echo "1 Running nano"
echo "2 Run vi program"
echo "3 Έναρξη προγράμματος emacs"
ηχώ "4 Έξοδος"
read doing #εδώ διαβάζουμε στη μεταβλητή $doing από την τυπική είσοδο

Υπόθεση $doing in
1)
/usr/bin/nano # αν το $doing είναι 1, τότε εκτελέστε το nano
;;
2)
Το /usr/bin/vi # αν το $doing περιέχει 2, τότε ξεκινήστε το vi
;;
3)
Το /usr/bin/emacs # αν το $doing περιέχει 3, τότε ξεκινήστε το emacs
;;
4)
έξοδος 0
;;
*) #αν έχει εισαχθεί κάτι από το πληκτρολόγιο που δεν περιγράφεται στη θήκη, κάντε τα εξής:
echo "Εισήγαγε μη έγκυρη ενέργεια"

Δήλωση υπόθεσης Esac #end.

Αποτέλεσμα εργασίας:
[email προστατευμένο]:~$ ./menu2.sh
Επιλέξτε έναν επεξεργαστή για εκκίνηση:
1 Εκκίνηση νανο
2 Έναρξη vi
3 Εκκινήστε το emacs
4 Έξοδος

Αφού επιλέξετε έναν αριθμό και πατήσετε Enter, θα ξεκινήσει ο επεξεργαστής που έχετε επιλέξει (εκτός αν, φυσικά, όλες οι διαδρομές είναι σωστές και έχετε εγκαταστήσει αυτούς τους επεξεργαστές :))
Ακολουθεί μια λίστα με λογικούς τελεστές που χρησιμοποιούνται για την κατασκευή if-then-else-fi:
-z # γραμμή είναι κενή
Η συμβολοσειρά -n # δεν είναι κενή
=, (==) # συμβολοσειρές είναι ίσες
!= # συμβολοσειρές δεν είναι ίσες
-eq # ισούται
-ne # άνισο
-<) # меньше
-λε,(<=) # меньше или равно
-gt,(>) #περισσότερα
-ge,(>=) #μεγαλύτερο ή ίσο με
! #άρνηση της δυαδικής έκφρασης
-α,(&&) #λογικό ΚΑΙ
-o,(||) # λογικό "OR"

Καταλάβαμε τα βασικά της γλώσσας και τις προϋποθέσεις για να μην υπερφορτώνουμε το άρθρο, θα το χωρίσω σε διάφορα μέρη (ας πούμε 3). Στο δεύτερο μέρος, θα αναλύσουμε τους τελεστές βρόχου και την απόδοση των μαθηματικών πράξεων.

UPD:Διορθώθηκαν ορισμένα σφάλματα
UPD:Ενημερώθηκε το τμήμα σχετικά με τις συνθήκες εάν-τότε-άλλο

Όλοι γνωρίζουν ότι το κέλυφος Bash έχει ενσωματωμένες εντολές που δεν βρίσκονται στους φακέλους /bin ή /usr/bin. Είναι ενσωματωμένα στο κέλυφος και λειτουργούν ως λειτουργίες. Σε ένα από τα προηγούμενα άρθρα, εξετάσαμε. Συζητήσαμε σχεδόν τα πάντα εκεί, πώς πρέπει να φαίνονται τα σενάρια, τη χρήση συνθηκών, βρόχων, μεταβλητών, αλλά δεν σταματήσαμε στις συναρτήσεις.

Στο σημερινό άρθρο, θα διορθώσουμε αυτή την έλλειψη. Όπως με κάθε γλώσσα προγραμματισμού, η Bash έχει λειτουργίες που μπορεί να είναι πολύ χρήσιμες στη χρήση. Θα εξετάσουμε τη χρήση συναρτήσεων bash, πώς να τις γράψουμε, ακόμη και πώς να δημιουργήσουμε βιβλιοθήκες από αυτές τις συναρτήσεις.

Πρώτα πρέπει να καταλάβουμε τι είναι μια συνάρτηση στο περιβάλλον μας. Μια συνάρτηση είναι ένα σύνολο εντολών, ενωμένων με ένα όνομα, που εκτελούν μια συγκεκριμένη εργασία. Η συνάρτηση καλείται με το όνομά της, μπορεί να λάβει παραμέτρους και να επιστρέψει το αποτέλεσμα της εργασίας. Εν ολίγοις, οι συναρτήσεις Bash λειτουργούν όπως και σε άλλες γλώσσες προγραμματισμού.

Η σύνταξη για τη δημιουργία μιας συνάρτησης είναι πολύ απλή:

function_name() ( λίστα εντολών )

Το όνομα της συνάρτησης δεν πρέπει να ταιριάζει με καμία από τις υπάρχουσες εντολές ή συναρτήσεις και όλες οι εντολές στο σώμα της συνάρτησης γράφονται σε μια νέα γραμμή.

απλή λειτουργία

Ας γράψουμε μια μικρή συνάρτηση που θα εκτυπώσει μια συμβολοσειρά στην οθόνη:

$ vi συνάρτηση.sh

#!/bin/bash
printstr()(
ηχώ "γεια σου κόσμε"
}
printstr

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

συνάρτηση chmod u+x.sh

Όλα λειτουργούν, τώρα ας περιπλέκουμε την εργασία, ας προσπαθήσουμε να περάσουμε ορίσματα στη συνάρτηση.

Επιχειρήματα συνάρτησης

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

όνομα_λειτουργίας επιχείρημα1 επιχείρημα2 ... επιχείρημαΝ

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

!/bin/bash
printstr()(
ηχώ $1
}
printstr "Γεια σου κόσμο"

Μπορείτε να έχετε πολλές επιλογές:

!/bin/bash
printstr()(
ηχώ $1
ηχώ $2
ηχώ $3
ηχώ $5
}
printstr "arg1" "arg2" "arg3" "arg4" "arg5"

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

!/bin/bash
printstr()(
ηχώ $1
βάρδια
ηχώ $1
βάρδια
ηχώ $1
βάρδια
ηχώ $1
}
printstr "arg1" "arg2" "arg3" "arg4"

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

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

!/bin/bash
printstr()(
επιστροφή 134;
}
printstr
ηχώ $;

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

!/bin/bash
printstr()(
ηχώ "δοκιμή"
}
VAR=$(printstr)
echo $VAR

Λειτουργίες εξαγωγής

Μπορείτε να κάνετε μια συνάρτηση διαθέσιμη εκτός ενός σεναρίου με την εντολή δήλωση:

!/bin/bash
printstr()(
ηχώ "γεια σου κόσμε"
}
δηλώνω -x -f printstr

Στη συνέχεια, εκτελέστε το σενάριο με την εντολή πηγής:

λειτουργία πηγής.sh
$printstr

αναδρομή

Μπορείτε να καλέσετε μια συνάρτηση από μέσα της για να κάνετε την αναδρομή:

!/bin/bash
printstr()(
ηχώ "γεια σου κόσμε"
printstr
}
printstr

Μπορείτε να πειραματιστείτε με τη χρήση της αναδρομής, μπορεί να είναι χρήσιμη σε πολλές περιπτώσεις, απλά θυμηθείτε να κάνετε την πρώτη κλήση συνάρτησης Bash.

Τοπικές μεταβλητές σε μια συνάρτηση

Εάν δηλώσετε μια συνηθισμένη μεταβλητή σε μια συνάρτηση, τότε θα είναι διαθέσιμη σε όλο το σενάριο, αυτό είναι βολικό για την επιστροφή μιας τιμής συνάρτησης, αλλά μερικές φορές μπορεί να είναι απαραίτητο να δημιουργήσετε μια τοπική μεταβλητή. Υπάρχει μια τοπική εντολή για αυτό:

!/bin/bash
printstr()(
τοπικό VAR=1$
ηχώ $(var)
}
printstr "Hello World"

Βιβλιοθήκες λειτουργιών

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

test1()(
echo "Hello World from 1"?
}
test2()(
echo "Hello World from 2"?
}
test3()(
echo "Hello World from 3"?
}

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

!/bin/bash
πηγή lib.sh
δοκιμή 1
τεστ2
δοκιμή 3

συμπεράσματα

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