Ο οδηγός για αρχάριους στο Shell Scripting Τα βασικά
Ο όρος "script scripting" αναφέρεται συχνά σε φόρουμ του Linux, αλλά πολλοί χρήστες δεν το γνωρίζουν. Η μάθηση αυτής της εύκολης και ισχυρής μεθόδου προγραμματισμού μπορεί να σας βοηθήσει να εξοικονομήσετε χρόνο, να μάθετε καλύτερα τη γραμμή εντολών και να απαλλαγείτε από τις κουραστικές εργασίες διαχείρισης αρχείων.
Τι είναι το Shell Scripting?
Το να είσαι χρήστης του Linux σημαίνει ότι παίζεις με τη γραμμή εντολών. Όπως αυτό ή όχι, υπάρχουν μόνο μερικά πράγματα που γίνονται πολύ πιο εύκολα μέσω αυτής της διασύνδεσης παρά με τοποθέτηση και κλικ. Όσο περισσότερο χρησιμοποιείτε και μαθαίνετε την γραμμή εντολών, τόσο περισσότερο βλέπετε τις δυνατότητές της. Λοιπόν, η ίδια η γραμμή εντολών είναι ένα πρόγραμμα: το κέλυφος. Οι περισσότεροι διανομείς του Linux χρησιμοποιούν σήμερα Bash, και αυτό είναι που εισάγετε πραγματικά τις εντολές.
Τώρα, ορισμένοι από εσάς που χρησιμοποιούσατε τα Windows πριν χρησιμοποιήσετε το Linux ενδέχεται να θυμούνται αρχεία δέσμης. Αυτά ήταν μικρά αρχεία κειμένου που θα μπορούσατε να συμπληρώσετε με εντολές για εκτέλεση και τα Windows θα τα χρησιμοποιούσαν με τη σειρά τους. Ήταν ένας έξυπνος και τακτοποιημένος τρόπος για να κάνετε κάποια πράγματα, όπως τα παιχνίδια στο εργαστήριο υπολογιστών του γυμνασίου όταν δεν μπορείτε να ανοίξετε φακέλους συστήματος ή να δημιουργήσετε συντομεύσεις. Τα αρχεία παρτίδας στα Windows, ενώ είναι χρήσιμα, είναι μια φτηνή απομίμηση σεναρίων κελύφους.
Οι δέσμες ενεργειών Shell μας επιτρέπουν να προγραμματίζουμε εντολές σε αλυσίδες και το σύστημα να τις εκτελεί ως σκηνοθετημένο συμβάν, ακριβώς όπως τα αρχεία δέσμης. Επιτρέπουν επίσης πολύ πιο χρήσιμες λειτουργίες, όπως η αντικατάσταση των εντολών. Μπορείτε να καλέσετε μια εντολή, όπως την ημερομηνία, και να χρησιμοποιήσετε την έξοδο της ως μέρος ενός σχεδίου ονοματοδοσίας αρχείων. Μπορείτε να αυτοματοποιήσετε τα αντίγραφα ασφαλείας και κάθε αρχείο αντιγραφής μπορεί να έχει την τρέχουσα ημερομηνία προσαρτημένη στο τέλος του ονόματος. Τα scripts δεν είναι μόνο επικλήσεις εντολών. Είναι προγράμματα από μόνα τους. Η δέσμη ενεργειών σάς επιτρέπει να χρησιμοποιείτε λειτουργίες προγραμματισμού - όπως βρόχους 'for', if / then / else και ούτω καθεξής - απευθείας στο περιβάλλον εργασίας του λειτουργικού σας συστήματος. Και, δεν χρειάζεται να μάθετε άλλη γλώσσα επειδή χρησιμοποιείτε αυτό που γνωρίζετε ήδη: η γραμμή εντολών.
Αυτή είναι η δύναμη της γραφής, νομίζω. Μπορείτε να προγραμματίσετε με εντολές που ήδη γνωρίζετε, ενώ μαθαίνετε συρραπτικά από τις περισσότερες σημαντικές γλώσσες προγραμματισμού. Πρέπει να κάνετε κάτι επαναλαμβανόμενο και κουραστικό; Σενάριο αυτό! Χρειάζεστε μια συντόμευση για μια πραγματικά περίπλοκη εντολή; Σενάριο αυτό! Θέλετε να δημιουργήσετε μια πραγματικά εύχρηστη διεπαφή γραμμής εντολών για κάτι; Σενάριο αυτό!
Πριν ξεκινήσεις
Πριν αρχίσουμε τη σειρά σεναρίων, ας καλύψουμε κάποιες βασικές πληροφορίες. Θα χρησιμοποιήσουμε το κέλυφος bash, το οποίο χρησιμοποιούν οι περισσότερες διανομές Linux. Το Bash είναι διαθέσιμο για χρήστες Mac OS και Cygwin στα Windows, επίσης. Δεδομένου ότι είναι τόσο καθολική, θα πρέπει να είστε σε θέση να script, ανεξάρτητα από την πλατφόρμα σας. Επιπλέον, εφ 'όσον υπάρχουν όλες οι εντολές που αναφέρονται, τα σενάρια μπορούν να λειτουργούν σε πολλαπλές πλατφόρμες με ελάχιστη ή μη τροποποίηση.
Το Scripting μπορεί εύκολα να κάνει χρήση προνομίων "administrator" ή "superuser", οπότε είναι καλύτερο να δοκιμάσετε σενάρια προτού τα βάλετε στη δουλειά. Χρησιμοποιήστε επίσης την κοινή λογική, όπως να βεβαιωθείτε ότι έχετε δημιουργήσει αντίγραφα ασφαλείας των αρχείων στα οποία πρόκειται να εκτελέσετε μια δέσμη ενεργειών. Είναι επίσης πολύ σημαντικό να χρησιμοποιήσετε τις σωστές επιλογές, όπως -i για την εντολή rm, έτσι ώστε να απαιτείται η αλληλεπίδρασή σας. Αυτό μπορεί να αποτρέψει κάποια δυσάρεστα λάθη. Ως εκ τούτου, διαβάστε τα σενάρια που κατεβάζετε και να είστε προσεκτικοί με τα δεδομένα που έχετε, μόνο σε περίπτωση που τα πράγματα πάνε στραβά.
Στον πυρήνα τους, τα σενάρια είναι απλά αρχεία κειμένου. Μπορείτε να χρησιμοποιήσετε οποιοδήποτε πρόγραμμα επεξεργασίας κειμένου για να τα γράψετε: gedit, emacs, vim, nano ... Αυτή η λίστα συνεχίζεται. Απλά φροντίστε να το αποθηκεύσετε ως απλό κείμενο, όχι ως πλούσιο κείμενο ή έγγραφο του Word. Δεδομένου ότι μου αρέσει η ευκολία χρήσης που παρέχει το nano, θα το χρησιμοποιώ.
Δικαιώματα και ονόματα σεναρίων
Τα scripts εκτελούνται σαν προγράμματα, και για να συμβεί αυτό πρέπει να έχουν τα κατάλληλα δικαιώματα. Μπορείτε να εκτελέσετε τα scripts εκτελέσιμα ακολουθώντας την ακόλουθη εντολή:
chmod + x ~ / somecrazyfolder / script1
Αυτό θα επιτρέψει σε οποιονδήποτε να εκτελέσει το συγκεκριμένο σενάριο. Εάν θέλετε να περιορίσετε τη χρήση του μόνο στον χρήστη σας, μπορείτε να χρησιμοποιήσετε αυτό αντί:
chmod u + x ~ / somecrazyfolder / script1
Για να εκτελέσετε αυτή τη δέσμη ενεργειών, θα πρέπει να κάνετε cd στον κατάλληλο κατάλογο και στη συνέχεια να εκτελέσετε το σενάριο ως εξής:
cd ~ / somecrazyfolder
./ script1
Για να κάνετε τα πράγματα πιο βολικά, μπορείτε να τοποθετήσετε σενάρια σε ένα φάκελο "bin" στον οικείο κατάλογό σας:
~ / bin
Σε πολλές σύγχρονες διανομές, ο φάκελος αυτός δεν δημιουργείται πλέον από προεπιλογή, αλλά μπορείτε να τον δημιουργήσετε. Αυτό είναι συνήθως όπου αποθηκεύονται εκτελέσιμα αρχεία που ανήκουν στον χρήστη και όχι σε άλλους χρήστες. Με την τοποθέτηση σεναρίων εδώ, μπορείτε απλά να τα εκτελέσετε πληκτρολογώντας το όνομά τους, όπως και άλλες εντολές, αντί να πρέπει να κάνετε cd και να χρησιμοποιήσετε το πρόθεμα './'.
Ωστόσο, προτού ονομάσετε μια δέσμη ενεργειών, θα πρέπει να ακολουθήσετε την ακόλουθη εντολή για να ελέγξετε αν έχετε εγκαταστήσει ένα πρόγραμμα που χρησιμοποιεί αυτό το όνομα:
που [εντολή]
Πολλοί άνθρωποι ονομάζουν το "δοκιμή" των πρώιμων σεναρίων τους και όταν προσπαθούν να το εκτελέσουν στη γραμμή εντολών, δεν συμβαίνει τίποτα. Αυτό οφείλεται στο ότι έρχεται σε σύγκρουση με την εντολή δοκιμής, η οποία δεν κάνει τίποτα χωρίς επιχειρήματα. Πάντα να είστε σίγουροι ότι τα ονόματα των σεναρίων σας δεν έρχονται σε σύγκρουση με εντολές, διαφορετικά μπορεί να βρεθείτε να κάνετε πράγματα που δεν σκοπεύετε να κάνετε!
Οδηγίες δέσμης ενεργειών
Όπως ανέφερα προηγουμένως, κάθε αρχείο δέσμης ενεργειών είναι ουσιαστικά απλό κείμενο. Αυτό δεν σημαίνει ότι μπορείτε να γράψετε ό, τι θέλετε όλοι willy-nilly, όμως. Όταν επιχειρείται εκτέλεση ενός αρχείου κειμένου, τα κοχύλια θα αναλύσουν μέσω αυτών για ενδείξεις ως προς το αν πρόκειται για δέσμες ενεργειών ή όχι και πώς να χειριστούν όλα σωστά. Εξαιτίας αυτού, υπάρχουν μερικές οδηγίες που πρέπει να γνωρίζετε.
- Κάθε σενάριο πρέπει να είναι με "#! / Bin / bash"
- Κάθε νέα γραμμή είναι μια νέα εντολή
- Οι γραμμές γραμμής ξεκινούν με ένα #
- Οι εντολές περιβάλλονται από ()
Το Hash-Bang Hack
Όταν ένα κέλυφος αναλύει ένα αρχείο κειμένου, ο πιο άμεσος τρόπος για να προσδιορίσετε το αρχείο ως σενάριο είναι κάνοντας την πρώτη σας γραμμή:
#! / bin / bash
Αν χρησιμοποιείτε άλλο κέλυφος, αντικαταστήστε την διαδρομή του εδώ. Οι γραμμές γραμμής ξεκινούν με χασίματα (#), αλλά προσθέτοντας το κτύπημα (!) Και τη διαδρομή του κελύφους αφού είναι ένα είδος hack που θα παρακάμψει αυτόν τον κανόνα σχολίου και θα αναγκάσει το σενάριο να εκτελεστεί με το κέλυφος που δείχνει αυτή η γραμμή.
Νέα γραμμή = Νέα εντολή
Κάθε νέα γραμμή θα πρέπει να θεωρείται νέα εντολή ή συστατικό ενός μεγαλύτερου συστήματος. Οι εντολές if / then / else, για παράδειγμα, θα αναλάβουν πολλές γραμμές, αλλά κάθε στοιχείο αυτού του συστήματος βρίσκεται σε νέα γραμμή. Μην αφήνετε μια εντολή να αιμορραγεί στην επόμενη γραμμή, καθώς αυτό μπορεί να περικόψει την προηγούμενη εντολή και να σας δώσει σφάλμα στην επόμενη γραμμή. Αν ο επεξεργαστής κειμένου σας το κάνει αυτό, θα πρέπει να απενεργοποιήσετε την περιτύλιξη κειμένου για να είστε στην ασφαλή πλευρά. Μπορείτε να απενεργοποιήσετε την περιτύλιξη κειμένου σε nano bit πατώντας ALT + L.
Σχόλιο Συχνά με #s
Εάν ξεκινήσετε μια γραμμή με #, η γραμμή αγνοείται. Αυτό το μετατρέπει σε γραμμή σχολίων, όπου μπορείτε να θυμηθείτε ποια ήταν η έξοδος της προηγούμενης εντολής ή τι θα κάνει η επόμενη εντολή. Και πάλι, απενεργοποιήστε την περιτύλιξη κειμένου ή σπάζετε το σχόλιό σας σε πολλές γραμμές που ξεκινούν με ένα hash. Η χρήση πολλών σχολίων είναι μια καλή πρακτική για να κρατήσετε, δεδομένου ότι σας επιτρέπει και άλλους ανθρώπους τσίμπημα scripts σας πιο εύκολα. Η μόνη εξαίρεση είναι η προαναφερθείσα hash-bang hack, οπότε μην ακολουθείτε το # s με! S. ;-)
Οι εντολές περιβάλλονται από παρενθέσεις
Σε παλαιότερες εποχές, οι αντικαταστάσεις εντολών έγιναν με απλά σημάδια επισημάνσεως (', μοιράζεται το κλειδί ~). Δεν πρόκειται να το αγγίξουμε ακόμα, αλλά καθώς οι περισσότεροι άνθρωποι πηγαίνουν μακριά και εξερευνούν μετά από να μάθουν τα βασικά, είναι πιθανώς μια καλή ιδέα να αναφέρω ότι θα πρέπει να χρησιμοποιήσετε παρενθέσεις αντ 'αυτού. Αυτό συμβαίνει κυρίως επειδή όταν φωλιάζετε - τοποθετείτε εντολές μέσα σε άλλες εντολές - οι παρενθέσεις λειτουργούν καλύτερα.
Το πρώτο σας σενάριο
Ας ξεκινήσουμε με ένα απλό script που σας επιτρέπει να αντιγράφετε αρχεία και να προσθέτετε ημερομηνίες στο τέλος του ονόματος αρχείου. Ας το ονομάσουμε "datecp". Πρώτον, ας ελέγξουμε αν το όνομα αυτό έρχεται σε σύγκρουση με κάτι:
Μπορείτε να δείτε ότι δεν υπάρχει έξοδος από την οποία εντολή, οπότε όλοι είμαστε έτοιμοι να χρησιμοποιήσουμε αυτό το όνομα.
Ας δημιουργήσουμε ένα κενό αρχείο στο φάκελο ~ / bin:
αγγίξτε το ~ / bin / datecp
Και, ας αλλάξουμε τώρα την άδεια, προτού ξεχάσουμε:
Ας αρχίσουμε λοιπόν να δημιουργούμε το σενάριό μας. Ανοίξτε αυτό το αρχείο στον επεξεργαστή κειμένου που έχετε επιλέξει. Όπως είπα, μου αρέσει η απλότητα του νανο.
nano ~ / bin / datecp
Και, ας πάμε μπροστά και βάζουμε την προϋπόθεση πρώτη γραμμή, και ένα σχόλιο για το τι κάνει αυτό το σενάριο.
Στη συνέχεια, ας δηλώσουμε μια μεταβλητή. Εάν έχετε πάρει ποτέ άλγεβρα, πιθανότατα ξέρετε τι είναι αυτό. Μια μεταβλητή μας επιτρέπει να αποθηκεύουμε πληροφορίες και να κάνουμε πράγματα μαζί της. Οι μεταβλητές μπορούν να "επεκταθούν" όταν αναφέρονται σε άλλο σημείο. Δηλαδή, αντί να εμφανίζεται το όνομά τους, θα εμφανίζουν το αποθηκευμένο τους περιεχόμενο. Μπορείτε αργότερα να ενημερώσετε την ίδια μεταβλητή για την αποθήκευση διαφορετικών πληροφοριών και οποιαδήποτε εντολή που θα εμφανιστεί μετά θα χρησιμοποιήσει τις νέες πληροφορίες. Είναι ένα πολύ φανταστικό σύμβολο κράτησης θέσης.
Τι θα βάλουμε σε μεταβλητή; Λοιπόν, ας αποθηκεύσουμε την ημερομηνία και την ώρα! Για να το κάνετε αυτό, θα καλέσουμε την εντολή ημερομηνίας.
Ρίξτε μια ματιά στο παρακάτω στιγμιότυπο οθόνης για τον τρόπο κατασκευής της εξόδου της εντολής ημερομηνίας:
Μπορείτε να δείτε ότι προσθέτοντας διαφορετικές μεταβλητές που ξεκινούν από το%, μπορείτε να αλλάξετε την έξοδο της εντολής σε αυτό που θέλετε. Για περισσότερες πληροφορίες, μπορείτε να δείτε τη σελίδα με το εγχειρίδιο για την εντολή ημερομηνίας.
Ας χρησιμοποιήσουμε αυτή την τελευταία επανάληψη της εντολής ημερομηνίας, "ημερομηνία +% m_% d_% y-% H.% M.% S" και χρησιμοποιήστε αυτήν στη δέσμη ενεργειών μας.
Αν θέλαμε να σώσουμε αυτό το σενάριο αυτή τη στιγμή, θα μπορούσαμε να το εκτελέσουμε και θα μας έδινε την έξοδο της εντολής ημερομηνίας όπως θα περίμενε κανείς:
Αλλά, ας κάνουμε κάτι διαφορετικό. Ας δώσουμε ένα μεταβλητό όνομα, όπως date_formatted σε αυτήν την εντολή. Η σωστή σύνταξη γι 'αυτό είναι η εξής:
variable = $ (εντολή -ορίσματα εξαιρέσεων)
Και για εμάς, θα το χτίσαμε έτσι:
date_formatted = $ (ημερομηνία +% m_% d_% y-% H.% M.% S)
Αυτό καλούμε την υποκατάσταση εντολής. Είμαστε ουσιαστικά λέει bash ότι κάθε φορά που εμφανίζεται η μεταβλητή "date_formatted", για να εκτελέσετε την εντολή μέσα στις παρενθέσεις. Στη συνέχεια, ανεξάρτητα από την έξοδο που δίνουν οι εντολές, πρέπει να εμφανίζεται αντί για το όνομα της μεταβλητής, "date_formatted".
Ακολουθεί ένα σενάριο και το αποτέλεσμα:
Σημειώστε ότι υπάρχουν δύο κενά στην έξοδο. Ο χώρος μέσα στα εισαγωγικά της εντολής echo και ο χώρος μπροστά από τη μεταβλητή εμφανίζονται και τα δύο. Μην χρησιμοποιείτε κενά εάν δεν θέλετε να εμφανίζονται. Σημειώστε επίσης ότι χωρίς αυτή την προστιθέμενη γραμμή "echo", το σενάριο δεν θα δώσει απολύτως καμία έξοδο.
Ας επιστρέψουμε στο σενάριό μας. Ας προσθέσουμε το επόμενο κομμάτι της εντολής.
cp -iv $ 1 $ 2. $ date_formatted
Αυτό θα ενεργοποιήσει την εντολή αντιγραφής, με τις επιλογές -i και -v. Ο πρώτος θα σας ζητήσει την επαλήθευση πριν από την αντικατάσταση ενός αρχείου και ο τελευταίος θα εμφανίσει αυτό που βρίσκεται κάτω στη γραμμή εντολών.
Στη συνέχεια, μπορείτε να δείτε ότι πρόσθεσα την επιλογή "$ 1". Κατά τη δημιουργία δέσμης ενεργειών, ένα σύμβολο δολαρίου ($) που ακολουθείται από έναν αριθμό θα υποδηλώνει αυτό το αριθμημένο όρισμα του σεναρίου όταν κλήθηκε. Για παράδειγμα, στην ακόλουθη εντολή:
cp -iv Trogdor2.mp3 ringtone.mp3
Το πρώτο επιχείρημα είναι "Trogdor2.mp3" και το δεύτερο επιχείρημα είναι "ringtone.mp3".
Κοιτώντας πίσω στη δέσμη ενεργειών μας, μπορούμε να δούμε ότι αναφέρουμε δύο επιχειρήματα:
Αυτό σημαίνει ότι όταν τρέχουμε τη δέσμη ενεργειών, θα πρέπει να δώσουμε δύο επιχειρήματα για τη σωστή εκτέλεση του σεναρίου. Το πρώτο όρισμα, $ 1, είναι το αρχείο που θα αντιγραφεί και αντικαθίσταται ως το πρώτο όρισμα της εντολής "cp -iv".
Το δεύτερο επιχείρημα, $ 2, θα λειτουργήσει ως αρχείο εξόδου για την ίδια εντολή. Αλλά, μπορείτε επίσης να δείτε ότι είναι διαφορετικό. Έχουμε προσθέσει μια περίοδο και έχουμε αναφερθεί παραπάνω από τη μεταβλητή "date_formatted". Περίεργα για το τι κάνει αυτό?
Εδώ είναι τι συμβαίνει όταν εκτελείται το σενάριο:
Μπορείτε να δείτε ότι το αρχείο εξόδου παρατίθεται ως ό, τι εισάγαμε για $ 2, ακολουθούμενο από μια περίοδο, τότε η έξοδος της εντολής ημερομηνίας! Έχει νόημα, σωστά?
Τώρα όταν τρέχω την εντολή datecp, θα τρέξει αυτή τη δέσμη ενεργειών και θα μου επιτρέψει να αντιγράψω οποιοδήποτε αρχείο σε μια νέα θέση και να προσθέσω αυτόματα την ημερομηνία και την ώρα στο τέλος του ονόματος αρχείου. Χρήσιμο για την αρχειοθέτηση του υλικού!
Shell scripting είναι στο επίκεντρο του να κάνει το OS σας να λειτουργήσει για σας. Δεν χρειάζεται να μάθετε μια νέα γλώσσα προγραμματισμού για να συμβεί αυτό. Δοκιμάστε να κάνετε scripting με κάποιες βασικές εντολές στο σπίτι και να αρχίσετε να σκέφτεστε τι μπορείτε να χρησιμοποιήσετε για αυτό.
Σενάρεις; Έχετε κάποια συμβουλή για αρχάριους; Μοιραστείτε τις σκέψεις σας στα σχόλια! Υπάρχουν πολλά να έρθουν σε αυτή τη σειρά!