3.3 Μάθημα 1
Πιστοποιητικό: |
Linux Essentials |
---|---|
Έκδοση: |
1.6 |
Θέμα: |
3 Η Δύναμη της Γραμμής Εντολών |
Σκοπός: |
3.3 Μετατροπή Εντολών σε Script |
Μάθημα: |
1 απο 2 |
Εισαγωγή
Έχουμε μάθει να εκτελούμε εντολές από το shell μέχρι στιγμής, αλλά μπορούμε επίσης να εισάγουμε εντολές σε ένα αρχείο και στη συνέχεια να ορίσουμε αυτό το αρχείο να είναι εκτελέσιμο. Όταν εκτελείται το αρχείο, αυτές οι εντολές εκτελούνται η μία μετά την άλλη. Αυτά τα εκτελέσιμα αρχεία ονομάζονται scripts και είναι ένα απολύτως κρίσιμο εργαλείο για κάθε διαχειριστή συστήματος Linux. Ουσιαστικά, μπορούμε να θεωρήσουμε ότι το Bash είναι γλώσσα προγραμματισμού αλλά και shell.
Εκτύπωση Εξόδου
Ας ξεκινήσουμε επιδεικνύοντας μια εντολή που μπορεί να έχετε δει σε προηγούμενα μαθήματα: η echo
θα εκτυπώσει ένα όρισμα στη τυπική έξοδο.
$ echo "Hello World!" Hello World!
Τώρα, θα χρησιμοποιήσουμε την ανακατεύθυνση αρχείου για να στείλουμε αυτήν την εντολή σε ένα νέο αρχείο που ονομάζεται new_script
.
$ echo 'echo "Hello World!"' > new_script $ cat new_script echo "Hello World!"
Το αρχείο new_script
περιέχει τώρα την ίδια εντολή με πριν.
Κάνοντας ένα Script Εκτελέσιμο
Ας δείξουμε μερικά από τα βήματα που απαιτούνται για να εκτελεστεί αυτό το αρχείο με τον τρόπο που περιμένουμε. Η πρώτη σκέψη ενός χρήστη μπορεί να είναι να πληκτρολογήσει απλώς το όνομα του script, με τον τρόπο που μπορεί να πληκτρολογήσει το όνομα οποιασδήποτε άλλης εντολής:
$ new_script /bin/bash: new_script: command not found
Μπορούμε να υποθέσουμε με ασφάλεια ότι το new_script
υπάρχει στην τρέχουσα τοποθεσία μας, αλλά παρατηρήστε ότι το μήνυμα σφάλματος δεν μας λέει ότι το αρχείο δεν υπάρχει, αλλά μας λέει ότι η εντολή δεν υπάρχει. Θα ήταν χρήσιμο να συζητήσουμε πώς το Linux χειρίζεται εντολές και εκτελέσιμα αρχεία.
Εντολές και PATH
Όταν πληκτρολογούμε την εντολή ls
στο shell, για παράδειγμα, εκτελούμε ένα αρχείο που ονομάζεται ls
που υπάρχει στο σύστημα αρχείων μας. Μπορείτε να το αποδείξετε χρησιμοποιώντας το which
:
$ which ls /bin/ls
Θα γινόταν γρήγορα κουραστικό να πληκτρολογούμε το απόλυτο path του ls
κάθε φορά που θέλουμε να κοιτάξουμε τα περιεχόμενα ενός καταλόγου, έτσι το Bash έχει μια μεταβλητή περιβάλλοντος που περιέχει όλους τους καταλόγους στους οποίους μπορεί να βρούμε τις εντολές που θέλουμε να εκτελέσουμε. Μπορείτε να δείτε τα περιεχόμενα αυτής της μεταβλητής χρησιμοποιώντας το echo
.
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Κάθε μία από αυτές τις τοποθεσίες είναι όπου το shell αναμένει να βρει μια εντολή, οριοθετημένη με άνω και κάτω τελεία (:
). Θα παρατηρήσετε ότι το /bin
είναι παρόν, αλλά είναι ασφαλές να υποθέσουμε ότι η τρέχουσα τοποθεσία μας δεν είναι. Το shell θα αναζητήσει το new_script
σε κάθε έναν από αυτούς τους καταλόγους, αλλά δεν θα το βρει και επομένως θα πετάξει το σφάλμα που είδαμε παραπάνω.
Υπάρχουν τρεις λύσεις σε αυτό το ζήτημα: μπορούμε να μετακινήσουμε το new_script
σε έναν από τους καταλόγους του PATH
, μπορούμε να προσθέσουμε τον τρέχοντα κατάλογο στο PATH
ή μπορούμε να αλλάξουμε τον τρόπο που προσπαθούμε να καλέσουμε το script. Η τελευταία λύση είναι η πιο εύκολη, απαιτεί απλώς να καθορίσουμε την τρέχουσα τοποθεσία όταν καλούμε το script χρησιμοποιώντας μια περίοδο μαζί με μια κάθετο (./
).
$ ./new_script /bin/bash: ./new_script: Permission denied
Το μήνυμα σφάλματος έχει αλλάξει, γεγονός που υποδεικνύει ότι έχουμε σημειώσει κάποια πρόοδο.
Δικαίωματα Εκτέλεσης
Η πρώτη έρευνα που πρέπει να κάνει ένας χρήστης σε αυτήν την περίπτωση είναι να χρησιμοποιήσει το ls -l
για να δει το αρχείο:
$ ls -l new_script -rw-rw-r-- 1 user user 20 Apr 30 12:12 new_script
Μπορούμε να δούμε ότι τα δικαιώματα για αυτό το αρχείο έχουν οριστεί σε 664
από προεπιλογή. Δεν έχουμε ορίσει ακόμα αυτό το αρχείο να έχει δικαιώματα εκτέλεσης.
$ chmod +x new_script $ ls -l new_script -rwxrwxr-x 1 user user 20 Apr 30 12:12 new_script
Αυτή η εντολή έχει δώσει δικαιώματα εκτέλεσης σε όλους τους χρήστες. Λάβετε υπόψη ότι αυτό μπορεί να αποτελεί κίνδυνο για την ασφάλεια, αλλά προς το παρόν αυτό είναι ένα αποδεκτό επίπεδο δικαιώματος.
$ ./new_script Hello World!
Είμαστε πλέον σε θέση να εκτελέσουμε το σενάριό μας.
Ορισμός του Interpreter
Όπως δείξαμε, μπορέσαμε απλώς να εισάγουμε κείμενο σε ένα αρχείο, να το ορίσουμε ως εκτελέσιμο και να το τρέξουμε. Το new_script
παραμένει λειτουργικά ένα κανονικό αρχείο κειμένου, αλλά καταφέραμε να το ερμηνεύσει το Bash. Τι γίνεται όμως αν είναι γραμμένο σε Perl ή Python;
Είναι πολύ καλή πρακτική να προσδιορίζουμε τον τύπο του interpreter που θέλουμε να χρησιμοποιήσουμε στην πρώτη γραμμή ενός script. Αυτή η γραμμή ονομάζεται bang line ή συνηθέστερα shebang. Υποδεικνύει στο σύστημα πώς θέλουμε να εκτελεστεί αυτό το αρχείο. Εφόσον μαθαίνουμε Bash, θα χρησιμοποιήσουμε το απόλυτο path του εκτελέσιμου για το Bash, χρησιμοποιώντας ξανά το which
:
$ which bash /bin/bash
Η shebang μας ξεκινά με δίεση και θαυμαστικό, ακολουθούμενο από το απόλυτο path παραπάνω. Ας ανοίξουμε το new_script
σε ένα πρόγραμμα επεξεργασίας κειμένου και ας εισάγουμε το shebang. Ας εκμεταλλευτούμε επίσης την ευκαιρία για να εισαγάγουμε ένα σχόλιο στο σενάριό μας. Τα σχόλια αγνοούνται από τον interpreter. Έχουν γραφτεί προς όφελος άλλων χρηστών που επιθυμούν να κατανοήσουν το σενάριό σας.
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. echo "Hello World!"
Θα κάνουμε μια επιπλέον αλλαγή στο όνομα του αρχείου επίσης: θα αποθηκεύσουμε αυτό το αρχείο ως new_script.sh
. Το suffix αρχείου ".sh" δεν αλλάζει την εκτέλεση του αρχείου με κανέναν τρόπο. Είναι μια σύμβαση τα bash scripts να επισημαίνονται με .sh
ή .bash
για να τα αναγνωρίζουν πιο εύκολα, με τον ίδιο τρόπο που τα Python scripts συνήθως προσδιορίζονται με το suffix .py
.
Κοινοί Επεξεργαστές Κειμένου
Οι χρήστες Linux συχνά πρέπει να εργάζονται σε περιβάλλον όπου δεν είναι διαθέσιμοι οι γραφικοί επεξεργαστές κειμένου. Επομένως, συνιστάται ιδιαίτερα να αναπτύξετε τουλάχιστον κάποια εξοικείωση με την επεξεργασία αρχείων κειμένου από τη γραμμή εντολών. Δύο από τους πιο συνηθισμένους επεξεργαστές κειμένου είναι το vi
και το nano
.
vi
Το vi
είναι ένα αξιοσέβαστο πρόγραμμα επεξεργασίας κειμένου και είναι εγκατεστημένο από προεπιλογή σχεδόν σε κάθε υπάρχον σύστημα Linux. Το vi
δημιούργησε έναν κλώνο που ονομάζεται vi IMproved ή vim
που προσθέτει κάποια λειτουργικότητα αλλά διατηρεί τη διεπαφή του vi
. Ενώ η εργασία με το vi
είναι αποθαρρυντική για έναν νέο χρήστη, ο επεξεργαστής είναι δημοφιλής και αγαπητός στους χρήστες που μαθαίνουν τις πολλές δυνατότητες του.
Η πιο σημαντική διαφορά μεταξύ του vi
και εφαρμογών όπως το Notepad είναι ότι το vi
έχει τρεις διαφορετικούς τρόπους λειτουργίας. Κατά την εκκίνηση, τα πλήκτρα H, J, K και L χρησιμοποιούνται για πλοήγηση και όχι για πληκτρολόγηση. Σε αυτήν την λειτουργία πλοήγησης, μπορείτε να πατήσετε I για να εισέλθετε στη λειτουργία εισαγωγής. Σε αυτό το σημείο, μπορείτε να πληκτρολογήσετε κανονικά. Για έξοδο από την λειτουργία εισαγωγής, πατάτε Esc για να επιστρέψετε στη λειτουργία πλοήγησης. Από τη λειτουργία πλοήγησης, μπορείτε να πατήσετε : για να μπείτε στη λειτουργία εντολής. Από αυτή τη λειτουργία, μπορείτε να αποθηκεύσετε, να διαγράψετε, να κλείσετε ή να αλλάξετε επιλογές.
Ενώ το vi
έχει μια καμπύλη εκμάθησης, οι διαφορετικοί τρόποι λειτουργίας μπορούν με τον καιρό να επιτρέψουν σε έναν έμπειρο χρήστη να γίνει πιο αποτελεσματικός από ό,τι με άλλους επεξεργαστές κειμένου.
nano
Το nano
είναι ένα νεότερο εργαλείο, κατασκευασμένο για να είναι απλό και πιο εύκολο στη χρήση από το vi
. Το nano
δεν έχει διαφορετικές λειτουργίες. Αντίθετα, ένας χρήστης κατά την εκκίνηση μπορεί να αρχίσει να πληκτρολογεί και χρησιμοποιεί Ctrl για πρόσβαση στα εργαλεία που αποτυπώνονται στο κάτω μέρος της οθόνης.
[ Welcome to nano. For basic help, type Ctrl+G. ] ^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos M-U Undo ^X Exit ^R Read File ^\ Replace ^U Uncut Text ^T To Spell ^_ Go To Line M-E Redo
Οι επεξεργαστές κειμένου είναι θέμα προσωπικής προτίμησης και ο επεξεργαστής που θα επιλέξετε να χρησιμοποιήσετε δεν θα έχει καμία σχέση με αυτό το μάθημα. Αλλά η εξοικείωση και η άνεση με έναν ή περισσότερους επεξεργαστές κειμένου θα αποδώσει στο μέλλον.
Μεταβλητές
Οι μεταβλητές αποτελούν σημαντικό μέρος οποιασδήποτε γλώσσας προγραμματισμού και το Bash δεν διαφέρει. Όταν ξεκινάτε ένα νέο session από το τερματικό, το shell ορίζει ήδη ορισμένες μεταβλητές για εσάς. Η μεταβλητή PATH
είναι ένα παράδειγμα αυτού. Αυτές τις ονομάζουμε μεταβλητές περιβάλλοντος, επειδή συνήθως ορίζουν χαρακτηριστικά του περιβάλλοντος του shell μας. Μπορείτε να τροποποιήσετε και να προσθέσετε μεταβλητές περιβάλλοντος, αλλά προς το παρόν ας εστιάσουμε στη ρύθμιση μεταβλητών μέσα στο σενάριό μας.
Θα τροποποιήσουμε το σενάριό μας ώστε να μοιάζει με αυτό:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=Carol echo "Hello $username!"
Σε αυτήν την περίπτωση, έχουμε δημιουργήσει μια μεταβλητή που ονομάζεται username
και της έχουμε εκχωρήσει την τιμή του Carol
. Λάβετε υπόψη ότι δεν υπάρχουν κενά μεταξύ του ονόματος της μεταβλητής, του συμβόλου ίσον ή της εκχωρημένης τιμής.
Στην επόμενη γραμμή, χρησιμοποιήσαμε την εντολή echo
με τη μεταβλητή, αλλά υπάρχει ένα σύμβολο δολαρίου ($
) μπροστά από το όνομα της μεταβλητής. Αυτό είναι σημαντικό, καθώς υποδεικνύει στο shell ότι θέλουμε να αντιμετωπίζουμε το username
ως μεταβλητή και όχι απλώς ως κανονική λέξη. Εισάγοντας $username
στην εντολή μας, υποδεικνύουμε ότι θέλουμε να εκτελέσουμε μια υποκατάσταση, αντικαθιστώντας το όνομα μιας μεταβλητής με την τιμή που έχει εκχωρηθεί σε αυτήν τη μεταβλητή.
Εκτελώντας το νέο script, παίρνουμε αυτό το αποτέλεσμα:
$ ./new_script.sh Hello Carol!
-
Τα ονόματα των μεταβλητών πρέπει να περιέχουν μόνο αλφαριθμητικούς χαρακτήρες ή κάτω παύλες και υπόκεινται στη διάκριση πεζών-κεφαλαίων. Το
Username
και τοusername
θα αντιμετωπίζονται ως ξεχωριστές μεταβλητές. -
Η υποκατάσταση μεταβλητής μπορεί επίσης να έχει τη μορφή
${username}
, με την προσθήκη του{ }
. Αυτό είναι επίσης αποδεκτό. -
Οι μεταβλητές στο Bash έχουν έναν υπονοούμενο τύπο και θεωρούνται συμβολοσειρές. Αυτό σημαίνει ότι η εκτέλεση μαθηματικών λειτουργιών στο Bash είναι πιο περίπλοκη από ό,τι θα ήταν σε άλλες γλώσσες προγραμματισμού όπως η C/C++:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=Carol x=2 y=4 z=$x+$y echo "Hello $username!" echo "$x + $y" echo "$z"
$ ./new_script.sh Hello Carol! 2 + 4 2+4
Χρήση Εισαγωγικών με Μεταβλητές
Ας κάνουμε την ακόλουθη αλλαγή στην τιμή της μεταβλητής μας username
:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=Carol Smith echo "Hello $username!"
Η εκτέλεση αυτού του script θα μας δώσει ένα σφάλμα:
$ ./new_script.sh ./new_script.sh: line 5: Smith: command not found Hello !
Λάβετε υπόψη ότι το Bash είναι interpreter και ως εκ τούτου ερμηνεύει το σενάριό μας γραμμή προς γραμμή. Σε αυτήν την περίπτωση, ερμηνεύει σωστά το username=Carol
ότι ορίζει μια μεταβλητή username
με την τιμή Carol
. Αλλά στη συνέχεια ερμηνεύει το κενό διάστημα ως ένδειξη του τέλους αυτής της ανάθεσης και το Smith
ως το όνομα μιας εντολής. Για να συμπεριληφθεί το κενό διάστημα και το όνομα Smith
ως η νέα τιμή της μεταβλητής μας, θα βάλουμε διπλά εισαγωγικά ("
) γύρω από το όνομα.
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username="Carol Smith" echo "Hello $username!"
$ ./new_script.sh Hello Carol Smith!
Ένα σημαντικό πράγμα που πρέπει να σημειωθεί για το Bash είναι ότι τα διπλά εισαγωγικά και τα μονά εισαγωγικά ('
) συμπεριφέρονται πολύ διαφορετικά. Τα διπλά εισαγωγικά θεωρούνται “αδύναμα” επειδή επιτρέπουν στον interpreter να κάνει υποκατάσταση μέσα στα εισαγωγικά. Τα μονά εισαγωγικά θεωρούνται “ισχυρά” επειδή εμποδίζουν την οποιαδήποτε υποκατάσταση απο το να συμβεί. Εξετάστε το ακόλουθο παράδειγμα:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username="Carol Smith" echo "Hello $username!" echo 'Hello $username!'
$ ./new_script.sh Hello Carol Smith! Hello $username!
Στη δεύτερη εντολή echo
, ο interpreter δεν μπορεί να υποκαταστήσει το $username
με το Carol Smith
, και έτσι η έξοδος λαμβάνεται κυριολεκτικά.
Ορίσματα
Είστε ήδη εξοικειωμένοι με τη χρήση ορισμάτων στα βασικά βοηθητικά προγράμματα του Linux. Για παράδειγμα, το rm testfile
περιέχει και το εκτελέσιμο rm
και ένα όρισμα testfile
. Ορίσματα μπορούν να περαστούν στο script κατά την εκτέλεση και θα τροποποιήσουν τον τρόπο συμπεριφοράς του script. Εφαρμόζονται εύκολα.
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=$1 echo "Hello $username!"
Αντί να εκχωρήσουμε μια τιμή στο username
απευθείας μέσα στο script, του εκχωρούμε την τιμή μιας νέας μεταβλητής $1
. Αυτό αναφέρεται στην τιμή του πρώτου ορίσματος.
$ ./new_script.sh Carol Hello Carol!
Τα πρώτα εννέα ορίσματα αντιμετωπίζονται με αυτόν τον τρόπο. Υπάρχουν τρόποι χειρισμού περισσότερων από εννέα ορισμάτων, αλλά αυτό είναι εκτός του πεδίου αυτού του μαθήματος. Θα δείξουμε ένα παράδειγμα χρησιμοποιώντας μόνο δύο ορίσματα:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username1=$1 username2=$2 echo "Hello $username1 and $username2!"
$ ./new_script.sh Carol Dave Hello Carol and Dave!
Υπάρχει μια σημαντική παράμετρος όταν χρησιμοποιείτε ορίσματα: Στο παραπάνω παράδειγμα, υπάρχουν δύο ορίσματα Carol
και Dave
, που έχουν εκχωρηθεί σε $1
και $2
αντίστοιχα. Εάν για παράδειγμα λείπει το δεύτερο όρισμα, το shell δεν θα εμφανίσει σφάλμα. Η τιμή του $2
θα είναι απλώς null, ή ανύπαρκτη.
$ ./new_script.sh Carol Hello Carol and !
Στην περίπτωσή μας, θα ήταν καλή ιδέα να εισάγουμε κάποια λογική στο σενάριό μας, έτσι ώστε διαφορετικές συνθήκες να επηρεάσουν την έξοδο που θέλουμε να εκτυπώσουμε. Θα ξεκινήσουμε εισάγοντας μια άλλη χρήσιμη μεταβλητή και στη συνέχεια θα προχωρήσουμε στη δημιουργία προτάσεων if.
Επιστροφή του Αριθμού των Ορισμάτων
Ενώ μεταβλητές όπως τα $1
και $2
περιέχουν την τιμή των ορισμάτων θέσης, μια άλλη μεταβλητή $#
περιέχει τον αριθμό των ορισμάτων.
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=$1 echo "Hello $username!" echo "Number of arguments: $#."
$ ./new_script.sh Carol Dave Hello Carol! Number of arguments: 2.
Υποθετική Λογική
Η χρήση της υποθετικής λογικής στον προγραμματισμό είναι ένα τεράστιο θέμα και δεν θα καλυφθεί σε βάθος σε αυτό το μάθημα. Θα επικεντρωθούμε στη σύνταξη των υποθετικών προτάσεων στο Bash, η οποία διαφέρει από τις περισσότερες άλλες γλώσσες προγραμματισμού.
Ας ξεκινήσουμε αναθεωρώντας το τι ελπίζουμε να πετύχουμε. Έχουμε ένα απλό script που θα πρέπει να μπορεί να εκτυπώσει έναν χαιρετισμό σε έναν μόνο χρήστη. Εάν υπάρχει κάτι άλλο εκτός από έναν χρήστη, θα πρέπει να εκτυπώσουμε ένα μήνυμα σφάλματος.
-
Η συνθήκη που ελέγχουμε είναι ο αριθμός των χρηστών, ο οποίος περιέχεται στη μεταβλητή
$#
. Θα θέλαμε να μάθουμε αν η τιμή του$#
είναι1
. -
Εάν η συνθήκη είναι αληθής, η ενέργεια που θα κάνουμε είναι να χαιρετίσουμε τον χρήστη.
-
Εάν η συνθήκη είναι ψευδής, θα εκτυπώσουμε ένα μήνυμα σφάλματος.
Τώρα που η λογική είναι ξεκάθαρη, θα επικεντρωθούμε στη σύνταξη που απαιτείται για την εφαρμογή αυτής της λογικής.
#!/bin/bash # A simple script to greet a single user. if [ $# -eq 1 ] then username=$1 echo "Hello $username!" else echo "Please enter only one argument." fi echo "Number of arguments: $#."
Η υποθετική λογική περιέχεται μεταξύ if
και fi
. Η συνθήκη προς έλεγχο βρίσκεται ανάμεσα σε αγκύλες [ ]
και η ενέργεια που πρέπει να γίνει εάν η συνθήκη είναι αληθής υποδεικνύεται μετά το then
. Λάβετε υπόψη τα κενά μεταξύ των αγκύλων και τη λογική που περιέχεται. Η παράλειψη αυτού του διαστήματος θα προκαλέσει σφάλματα.
Αυτό το script θα δώσει είτε τον χαιρετισμό μας, ή το μήνυμα σφάλματος. Αλλά θα εκτυπώνει πάντα τη γραμμή Number of arguments
.
$ ./new_script.sh Please enter only one argument. Number of arguments: 0. $ ./new_script.sh Carol Hello Carol! Number of arguments: 1.
Λάβετε υπόψη τη πρόταση if
. Χρησιμοποιήσαμε το -eq
για να κάνουμε μια αριθμητική σύγκριση. Σε αυτήν την περίπτωση, δοκιμάζουμε ότι η τιμή του $#
είναι ίση με ένα. Οι άλλες συγκρίσεις που μπορούμε να κάνουμε είναι:
-ne
-
Μη ίσο με
-gt
-
Μεγαλύτερο απο
-ge
-
Μεγαλύτερο απο ή ίσο του
-lt
-
Μικρότερο απο
-le
-
Μικρότετο απο ή ίσο του
Καθοδηγούμενες Ασκήσεις
-
Ο χρήστης πληκτρολογεί τα ακόλουθα στο κέλυφός του:
$ PATH=~/scripts $ ls Command 'ls' is available in '/bin/ls' The command could not be located because '/bin' is not included in the PATH environment variable. ls: command not found
-
Τι έχει κάνει ο χρήστης;
-
Ποια εντολή θα συνδυάσει την τρέχουσα τιμή του
PATH
με τον νέο κατάλογο~/scripts
;
-
-
Εξετάστε το ακόλουθο script. Σημειώστε ότι χρησιμοποιεί το
elif
για να ελέγξει για μια δεύτερη συνθήκη:> /!bin/bash > fruit1 = Apples > fruit2 = Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" > elif [$1 -gt $2 ] then > echo '$fruit1 win!' else > echo "Fruit2 win!" > done
-
Οι γραμμές που επισημαίνονται με
>
περιέχουν σφάλματα. Διορθώστε τα σφάλματα.
-
-
Ποια θα είναι η έξοδος στις ακόλουθες περιπτώσεις;
$ ./guided1.sh 3 0
$ ./guided1.sh 2 4
$ ./guided1.sh 0 1
Ασκήσεις Εξερεύνησης
-
Γράψτε ένα απλό script που θα ελέγχει αν έχουν δοθεί ακριβώς δύο ορίσματα. Εάν ναι, εκτυπώστε τα ορίσματα με αντίστροφη σειρά. Εξετάστε αυτό το παράδειγμα (σημείωση: ο κώδικάς σας μπορεί να φαίνεται διαφορετικός από αυτό, αλλά θα πρέπει να οδηγεί στην ίδια έξοδο):
if [ $1 == $number ] then echo "True!" fi
-
Αυτός ο κώδικας είναι σωστός, αλλά δεν είναι σύγκριση αριθμών. Χρησιμοποιήστε μια αναζήτηση στο Διαδίκτυο για να ανακαλύψετε πώς αυτός ο κώδικας διαφέρει από τη χρήση του
-eq
. -
Υπάρχει μια μεταβλητή περιβάλλοντος που θα εκτυπώσει τον τρέχοντα κατάλογο. Χρησιμοποιήστε το
env
για να ανακαλύψετε το όνομα αυτής της μεταβλητής. -
Χρησιμοποιώντας όσα μάθατε στις ερωτήσεις 2 και 3, γράψτε ένα σύντομο script που να δέχεται ένα όρισμα. Εάν ένα όρισμα δοθεί, ελέγξτε αν αυτό το όρισμα ταιριάζει με το όνομα του τρέχοντος καταλόγου. Αν ναι, τυπώστε
yes
. Διαφορετικά, εκτυπώστεno
.
Σύνοψη
Σε αυτή την ενότητα, μάθατε:
-
Πώς να δημιουργήσετε και να εκτελέσετε απλά scripts
-
Πώς να χρησιμοποιήσετε ένα shebang για να καθορίσετε έναν interpreter
-
Πώς να ορίσετε και να χρησιμοποιήσετε μεταβλητές μέσα σε scripts
-
Πώς να χειριστείτε ορίσματα σε scripts
-
Πώς να δημιουργήσετε υποθετικές προτάσεις
if
-
Πώς να συγκρίνετε αριθμούς χρησιμοποιώντας αριθμητικούς τελεστές
Εντολές που χρησιμοποιήθηκαν στις ασκήσεις:
echo
-
Εκτυπώστε μια συμβολοσειρά στη τυπική έξοδο.
env
-
Εκτυπώνει όλες τις μεταβλητές περιβάλλοντος στη τυπική έξοδο.
which
-
Εκτυπώνει το απόλυτο path μιας εντολής.
chmod
-
Αλλάζει τα δικαιώματα ενός αρχείου.
Ειδικές μεταβλητές που χρησιμοποιήθηκαν στις ασκήσεις:
$1, $2, … $9
-
Περιέχουν ορίσματα θέσης που διαβιβάζονται στο script.
$#
-
Περιέχει τον αριθμό των ορισμάτων που μεταβιβάστηκαν στο script.
$PATH
-
Περιέχει τους καταλόγους που έχουν εκτελέσιμα που χρησιμοποιούνται από το σύστημα.
Τελεστές που χρησιμοποιήθηκαν στις ασκήσεις:
-ne
-
Μη ίσο με
-gt
-
Μεγαλύτερο απο
-ge
-
Μεγαλύτερο απο ή ίσο του
-lt
-
Μικρότερο απο
-le
-
Μικρότετο απο ή ίσο του
Απαντήσεις στις Καθοδηγούμενες Ασκήσεις
-
Ο χρήστης πληκτρολογεί τα ακόλουθα στο κέλυφός του:
$ PATH=~/scripts $ ls Command 'ls' is available in '/bin/ls' The command could not be located because '/bin' is not included in the PATH environment variable. ls: command not found
-
Τι έχει κάνει ο χρήστης;
Ο χρήστης έχει αντικαταστήσει τα περιεχόμενα του PATH με τον κατάλογο
~/scripts
. Η εντολήls
δεν μπορεί πλέον να βρεθεί, καθώς δεν περιέχεται στο PATH. Λάβετε υπόψη ότι αυτή η αλλαγή επηρεάζει μόνο το τρέχον session, αποσύνδεση και επανασύνδεση θα επαναφέρει την αλλαγή. -
Ποια εντολή θα συνδυάσει την τρέχουσα τιμή του
PATH
με τον νέο κατάλογο~/scripts
;PATH=$PATH:~/scripts
-
-
Εξετάστε το ακόλουθο script. Σημειώστε ότι χρησιμοποιεί το
elif
για να ελέγξει για μια δεύτερη συνθήκη:> /!bin/bash > fruit1 = Apples > fruit2 = Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" > elif [$1 -gt $2 ] then > echo '$fruit1 win!' else > echo "Fruit2 win!" > done
-
Οι γραμμές που επισημαίνονται με
>
περιέχουν σφάλματα. Διορθώστε τα σφάλματα.#!/bin/bash fruit1=Apples fruit2=Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" elif [ $1 -gt $2 ] then echo "$fruit1 win!" else echo "$fruit2 win!" fi
-
-
Ποια θα είναι η έξοδος στις ακόλουθες περιπτώσεις;
$ ./guided1.sh 3 0
Apples win!
$ ./guided1.sh 2 4
Oranges win!
$ ./guided1.sh 0 1
This is like comparing Apples and Oranges!
Απαντήσεις στις Ασκήσεις Εξερεύνησης
-
Γράψτε ένα απλό script που θα ελέγχει αν έχουν δοθεί ακριβώς δύο ορίσματα. Εάν ναι, εκτυπώστε τα ορίσματα με αντίστροφη σειρά. Εξετάστε αυτό το παράδειγμα (σημείωση: ο κώδικάς σας μπορεί να φαίνεται διαφορετικός από αυτό, αλλά θα πρέπει να οδηγεί στην ίδια έξοδο):
if [ $1 == $number ] then echo "True!" fi
#!/bin/bash if [ $# -ne 2 ] then echo "Error" else echo "$2 $1" fi
-
Αυτός ο κώδικας είναι σωστός, αλλά δεν είναι σύγκριση αριθμών. Χρησιμοποιήστε μια αναζήτηση στο Διαδίκτυο για να ανακαλύψετε πώς αυτός ο κώδικας διαφέρει από τη χρήση του
-eq
.Χρησιμοποιώντας το
==
θα συγκριθούν συμβολοσειρές. Δηλαδή, εάν οι χαρακτήρες και των δύο μεταβλητών ταιριάζουν ακριβώς, τότε η συνθήκη είναι αληθής.abc == abc
αληθής
abc == ABC
ψευδής
1 == 1
αληθής
1+1 == 2
ψευδής
Οι συγκρίσεις συμβολοσειρών οδηγούν σε απροσδόκητη συμπεριφορά εάν δοκιμάζετε αριθμούς.
-
Υπάρχει μια μεταβλητή περιβάλλοντος που θα εκτυπώσει τον τρέχοντα κατάλογο. Χρησιμοποιήστε το
env
για να ανακαλύψετε το όνομα αυτής της μεταβλητής.PWD
-
Χρησιμοποιώντας όσα μάθατε στις ερωτήσεις 2 και 3, γράψτε ένα σύντομο script που να δέχεται ένα όρισμα. Εάν ένα όρισμα δοθεί, ελέγξτε αν αυτό το όρισμα ταιριάζει με το όνομα του τρέχοντος καταλόγου. Αν ναι, τυπώστε
yes
. Διαφορετικά, εκτυπώστεno
.#!/bin/bash if [ "$1" == "$PWD" ] then echo "yes" else echo "no" fi