Εισαγωγ_ στο Unix - LPIS_2_ by hcj

VIEWS: 0 PAGES: 89

									       Κελύφη, Μεταβλητές και
       Προγραμματισμός

       Γλώσσα C & Unix
       Τμήμα Πληροφορικής, ΑΠΘ
       B’ εξάμηνο

lpis.csd.auth.gr/curriculum/C+Unix/UNCL202.html
    Μεταβλητές του κελύφους
¡   Το κέλυφος του UNIX περιέχει ένα
    μηχανισμό μεταβλητών που κρατούν
    πληροφορίες χρήσιμες για το κέλυφος και
    για τα προγράμματα του χρήστη
    l   Όπως σε μια γλώσσα προγραμματισμού
¡   Το κέλυφος παρέχει ένα σύνολο από εντολές
    με τις οποίες ο χρήστης μπορεί να
    l   δει τις τιμές των μεταβλητών
    l   τις αλλάξει
    l   να δημιουργήσει δικές του μεταβλητές για να τις
        χρησιμοποιεί στα προγράμματα του
                                                          2
Κοινές μεταβλητές (HOME )

¡   Περιέχει το πλήρες μονοπάτι του
    home directory του χρήστη.
¡   To home directory είναι ένας
    κατάλογος στο σύστημα αρχείων του
    UNIX, στο οποίο ο χρήστης μπορεί να
    αποθηκεύει τα αρχεία του.
¡   Η τιμή στην μεταβλητή HOME
    ορίζεται από το κέλυφος κατά τη
    διάρκεια του login.
                                     3
    Κοινές μεταβλητές (PATH )
¡   Περιέχει ένα σύνολο από μονοπάτια,
    χωρισμένα με άνω και κάτω τελείες (:) που
    ορίζουν τα μονοπάτια στα οποία θα ψάχνει
    το κέλυφος για εκτελέσιμα αρχεία.
¡   Αν για παράδειγμα υπάρχει το πρόγραμμα
    calculator στον κατάλογο
    /users/bob/mybin/ τότε για να μπορεί ο
    χρήστης να τρέχει το calculator ανεξάρτητα
    από τον κατάλογο στον οποίο βρίσκεται, θα
    πρέπει η μεταβλητή PATH να περιέχει και το
    μονοπάτι /users/bob/mybin.

                                            4
    Κοινές μεταβλητές (LOGNAME,
    MAIL )
¡   Η LOGNAME κρατά το login name του
    χρήστη
    l   Ορίζεται αυτόματα από το κέλυφος κατά
        την είσοδο του χρήστη στο σύστημα.
¡   Η MAIL κρατά το όνομα του αρχείου στο
    οποίο αποθηκεύονται τα e-mails που
    φτάνουν για το χρήστη
    l   Το κέλυφος χρησιμοποιεί αυτή τη
        μεταβλητή για να ειδοποιεί τον χρήστη
        όταν καταφθάνουν νέα μηνύματα.

                                                5
    Κοινές μεταβλητές (SHELL, TERM )
¡   Η SHELL κρατά το όνομα του κελύφους που
    χρησιμοποιεί ο χρήστης.
    l   Κάθε φορά που ο χρήστης αλλάζει κέλυφος (π.χ.
        με την εντολή /bin/csh) ενημερώνεται ανάλογα και
        η μεταβλητή SHELL.
¡   Η TERM κρατά κάποιες πληροφορίες για τον
    τύπο του τερματικού που χρησιμοποιεί ο
    χρήστης.
    l   Αυτή η πληροφορία είναι χρήσιμη για
        προγράμματα όπως το vi για να προσαρμόζουν την
        έξοδο τους στις δυνατότητες του τερματικού.
                                                      6
Εμφάνιση της τιμής των
μεταβλητών
¡   Το κέλυφος δίνει τη δυνατότητα στο
    χρήστη να χρησιμοποιεί τις τιμές των
    μεταβλητών μέσα σε εντολές του
    UNIX σαν να ήταν κανονικό κείμενο.
¡   Η αναφορά στην τιμή μιας
    μεταβλητής γίνεται προσθέτοντας
    στην αρχή του ονόματος της
    μεταβλητής τον χαρακτήρα "$".


                                       7
    Εμφάνιση της τιμής των
    μεταβλητών - Παράδειγμα
¡   $ cd $ΗΟΜΕ
¡   Έχει ως αποτέλεσμα να μεταφερθούμε στο
    home directory του χρήστη.
¡   Όταν το κέλυφος συναντήσει τον χαρακτήρα
    $ και μετά το όνομα μιας μεταβλητής, τα
    αντικαθιστά αυτόματα με την τιμή της
    μεταβλητής.
¡   Αν υποθέσουμε ότι το home directory είναι
    το /users/bob, το κέλυφος μεταφράζει την
    εντολή cd $HOME στην εντολή
    cd /users/bob.
                                            8
    Εμφάνιση της τιμής των
    μεταβλητών - echo
¡ Για να τυπώσουμε την τιμή μιας μεταβλητής
  στην οθόνη χρησιμοποιούμε την εντολή
  echo η οποία τυπώνει το κείμενο που
  δέχεται στην είσοδο της.
$ echo Hallo world
Hallo world
$ echo $HOME
/users/bob
$ echo $PATH
/bin/:/usr/local/bin/:/users/bob/:/user
  s/bob/mybin/
                                          9
    Εμφάνιση της τιμής των
    μεταβλητών - set
¡   Επίσης μπορούμε να χρησιμοποιήσουμε την
    εντολή set, η οποία τυπώνει στην οθόνη τις
    τιμές όλων των μεταβλητών του κελύφους.
BASH=/usr/bin/bash
MAKE_MODE=unix
NUMBER_OF_PROCESSORS=1
OSTYPE=cygwin
PATH='/usr/local/bin:/usr/bin:/bin:...:.'
PROMPT='$P$G'
SESSIONNAME=Console
SHELL=/bin/bash
TERM=cygwin
                                                 10
    Ανάθεση τιμών σε μεταβλητές
¡    Ο χρήστης έχει τη δυνατότητα να αλλάζει
     τις τιμές των μεταβλητών
    l   Εκτός από αυτές που ορίζονται αυτόματα από το
        κέλυφος (π.χ. LOGNAME)
¡    Για να αλλάξουμε την τιμή μιας μεταβλητής,
     στο prompt του UNIX πληκτρολογούμε το
     όνομα της μεταβλητής, τον χαρακτήρα "="
     και την νέα τιμή της μεταβλητής.
$ TERM = vtlOO
$ ΡΑΤΗ = /users/billy/mybin

                                                    11
    Ανάθεση τιμών σε μεταβλητές –
    μεταβλητή PATH
¡   Η αλλαγή στην τιμή της PATH θα πρέπει να
    γίνεται πολύ προσεχτικά.
¡   Οι εντολές του UNIX είναι εκτελέσιμα αρχεία
    που βρίσκονται σε καταλόγους, τους οποίους
    περιέχει αρχικά η PATH ώστε να μπορεί ο
    χρήστης να τις εκτελεί.
¡   Συνήθως αυτό που χρειαζόμαστε με την PATH
    είναι να προσθέσουμε ακόμη ένα μονοπάτι σε
    αυτά που ήδη περιέχει.
¡   Αυτό γίνεται χρησιμοποιώντας το $ΡΑΤΗ που
    μεταφράζεται στην τιμή που ήδη έχει η
    μεταβλητή
                                            12
    Ανάθεση τιμών σε μεταβλητές –
    μεταβλητή PATH - Παράδειγμα

¡ Για να προσθέσουμε το μονοπάτι
  /users/billy/mybin στην μεταβλητή
  PATH, κάνουμε το εξής:
$ echo $PATH
/bin/:/usr/local/bin/:/users/billy/
$ PATH=$PATH:/users/billy/mybin
$ echo $PATH
/bin/:/usr/local/bin/:/users/billy/
  :/users/billy/mybin
                                    13
Δημιουργία μεταβλητών

¡   Για να ορίσουμε μια νέα μεταβλητή
    απλά της αναθέτουμε τιμή σαν να
    υπήρχε ήδη στο σύστημα και αυτή
    δημιουργείται αυτόματα.
¡   Δημιουργία μιας μεταβλητής με
    όνομα MYPLACE και τιμή
    /users/maria/documents/
$ MYPLACE=/users/maria/documents/

                                        14
    Συχνό Λάθος
¡ Το σημάδι $ το χρησιμοποιούμε μόνο
  όταν θέλουμε να χρησιμοποιήσουμε την
  τιμή μιας μεταβλητής και όχι για
  ανάθεση τιμής
$ X=2
$ echo $X
2
$ $X=3
bash: 2=3: command not found
                                    15
Διαγραφή μεταβλητών

¡   Με τη χρήση της εντολής unset
¡   Σύνταξη:
unset μεταβλητή
¡   Παράδειγμα:
unset X




                                    16
    Το περιβάλλον
¡    Ένα υποσύνολο των μεταβλητών του
     κελύφους.
¡    Μία ομάδα μεταβλητών στις οποίες
     έχουν πρόσβαση τα προγράμματα που
     τρέχει ο χρήστης από το κέλυφος.
¡    Όταν ο χρήστης ζητήσει την εκτέλεση
     ενός προγράμματος το πρόγραμμα αυτό
     μπορεί να χρησιμοποιήσει τις τιμές των
     μεταβλητών του κελύφους που ανήκουν
     στο περιβάλλον, αλλά όχι και τις
     υπόλοιπες μεταβλητές.
                                         17
    Το περιβάλλον
¡    Αρχικά στο περιβάλλον δεν
     περιέχονται οι μεταβλητές που
     ορίστηκαν από τον χρήστη και αυτές
     στις οποίες επενέβη ο χρήστης
     αλλάζοντας τις τιμές τους.
¡    Όμως το κέλυφος δίνει τη
     δυνατότητα στον χρήστη να
     προσθέσει στο περιβάλλον όποια
     μεταβλητή επιθυμεί.

                                      18
    Εκτύπωση μεταβλητών
    περιβάλλοντος

¡   Για να τυπώσουμε τις μεταβλητές του
    περιβάλλοντος χρησιμοποιούμε την
    εντολή env.
$ env
HOME=/users/billie
PWD=/users/billie/papers
MAILRC=/users/billie/mail/.mailrc
...

                                      19
         Συμπερίληψη μεταβλητής στο
         περιβάλλον
     ¡   Για να «αναγκάσουμε» το UNIX να
         συμπεριλάβει μια μεταβλητή στο περιβάλλον,
         χρησιμοποιούμε την εντολή export.
                                Η μεταβλητή PAPERS
                            Η μεταβλητή PAPERS
                                 επειδή ορίστηκε από
                            συμπεριλήφθηκε στο
$ export PAPERS
  PAPERS=/users/jimmy/papers       τον χρήστη δεν
                            περιβάλλον μετά την
$ env                              περιλαμβάνεται
                            εκτέλεση της εντολής
HOME=/users/jimmy                     αρχικά στο
                                   export
PWD=/users/jimmy/papers              περιβάλλον
MAILRC=/users/jimmy/mail/.mailrc
PATH=/usr/bin:/usr/local/bin
PAPERS=/users/jimmy/papers
                                                 20
    Ιστορικό εντολών
¡    Η εντολή history εμφανίζει στην οθόνη τις
     τελευταίες εντολές που εκτέλεσε ο χρήστης
     στο κέλυφος.
$ ls
a.txt documents games
$ cd games
$ ls
nfs3 fifa2000
$ cd ..
$ history
112 ls
113 cd games
114 cd ..
115 history
                                             21
    Ιστορικό εντολών
¡    Ο αριθμός των εντολών που εμφανίζει
     η εντολή history καθορίζεται από τη
     τιμή της μεταβλητής HISTSIZE.
¡    Η τιμή της HISTSIZE είναι αρχικά 500
     (στο CYGWIN) αλλά μπορεί να
     αλλάξει.
$ HISTSIZE=10

                                       22
    Συμπλήρωση ονομάτων
    αρχείων
¡   Ένα πολύ βολικό χαρακτηριστικό που δίνει
    στο χρήστη τη δυνατότητα να εργάζεται
    ευκολότερα και γρηγορότερα.
¡   Σύμφωνα με αυτό, όταν ο χρήστης θέλει να
    πληκτρολογήσει σε μία εντολή το όνομα
    ενός αρχείου (π.χ. cat text1.txt) δεν
    χρειάζεται να πληκτρολογήσει ολόκληρο το
    όνομα, αλλά μόνο τους πρώτους
    χαρακτήρες και το πλήκτρο TAB.
¡   Το κέλυφος τότε συμπληρώνει αυτόματα
    τους χαρακτήρες που υπολείπονται για να
    ολοκληρωθεί το όνομα του αρχείου.
                                          23
 Συμπλήρωση ονομάτων
 αρχείων - Παράδειγμα
$ ls
Alaska California Calories Kentucky
$ cat A <ΤΑΒ>
  l   ‘Ισοδυναμεί με την εντολή cat Alaska.
  l   Ένας μόνο χαρακτήρας αρκεί γιατί δεν
      υπάρχουν άλλα αρχεία που να ξεκινούν
      από A.
$ cat Cali <ΤΑΒ>
  l   ‘Ισοδυναμεί με την εντολή cat California.
  l   Εδώ χρειάζονται 4 χαρακτήρες για να γίνει
      η διάκριση από το αρχείο Calories.
                                              24
Προγραμματισμός του κελύφους

¡   Το κέλυφος εκτός από διερμηνέας
    εντολών εκτελεί το έργο και μιας
    γλώσσας προγραμματισμού στην
    οποία ο χρήστης μπορεί να γράψει
    τα δικά του προγράμματα (shell
    scripts) αυτοματοποιώντας κάποιες
    εργασίες που εκτελούνται συχνά

                                    25
    Προγραμματισμός του κελύφους
¡   Ένα πρόγραμμα στο κέλυφος μπορεί
    να:
    l   εκτελεί ένα σύνολο από εντολές του UNIX
        ή άλλες εφαρμογές
    l   έχει αλληλεπίδραση με το χρήστη (να
        τυπώνει μηνύματα στην οθόνη και να
        διαβάζει χαρακτήρες από το
        πληκτρολόγιο)
    l   δέχεται παραμέτρους κατά την εκτέλεση
        του
    l   αλλάζει την ροή εκτέλεσης με εντολές
        διακλάδωσης και επανάληψης κ.α.
                                             26
Προγραμματισμός του κελύφους
¡   Προγράμματα κελύφους υπάρχουν
    στα περισσότερα λειτουργικά
    συστήματα.
¡   Τα αντίστοιχα στο DOS είναι τα
    batch files (.bat)
    l   Είναι λιγότερο ευέλικτα και δεν έχουν
        τις δυνατότητες των shell scripts του
        UNIX.


                                                27
    Κατασκευή ενός απλού
    προγράμματος κελύφους

¡   Ένα απλό πρόγραμμα κελύφους
    ομαδοποιεί ένα σύνολο από εντολές
    του λειτουργικού συστήματος, τις
    οποίες εκτελεί σειριακά.
¡   Μόλις τερματίσει και η τελευταία
    εντολή τερματίζει και το πρόγραμμα
    και ο έλεγχος επιστρέφει στο prompt
    του UNIX
    l   Αν το πρόγραμμα εκτελέστηκε στο
        προσκήνιο
                                          28
    Κατασκευή ενός απλού προγράμματος
    κελύφους - Δημιουργία

¡ Για να δημιουργήσουμε ένα πρόγραμμα
  κελύφους που θα εκτελεί σειριακά τις
  εντολές: cal, pwd και ls -la, θα πρέπει να
  δημιουργήσουμε ένα αρχείο κειμένου (π.χ.
  my_first_script.sh), με κάποιον editor το
  οποίο θα περιέχει 3 γραμμές με τις εντολές
  που θέλουμε να εκτελέσουμε
cal
pwd
ls –la

                                          29
    Κατασκευή ενός απλού προγράμματος
    κελύφους - Δικαιώματα

¡   Στη συνέχεια, θα πρέπει να δοθούν στο
    αρχείο my_first_script.sh δικαιώματα
    εκτέλεσης ώστε να μπορεί ο χρήστης να το
    εκτελέσει όπως θα έκανε με οποιαδήποτε
    εντολή ή εφαρμογή.
¡   Για να δώσουμε στο αρχείο δικαιώματα
    εκτέλεσης για όλους τους χρήστες του
    συστήματος εκτελούμε την εντολή:
$ chmod ugo+x my_first_script.sh
ή
$ chmod a+x my_first_script.sh
                                               30
    Κατασκευή ενός απλού προγράμματος
    κελύφους - Εκτέλεση

¡ Για να εκτελέσουμε τώρα το
  πρόγραμμα αρκεί να πληκτρολογούμε
  το όνομα του.
$ my_first_script.sh
¡ Αν η μεταβλητή PATH δεν περιέχει το
  τρέχοντα κατάλογο, τότε πριν από το
  όνομα του προγράμματος
  πληκτρολογούμε τους χαρακτήρες "./".
$./my_first_script.sh
                                    31
Κατασκευή ενός απλού προγράμματος
κελύφους - Αποτελέσματα

¡   Εκτελώντας το πρόγραμμα του
    κελύφους, με έναν από τους
    παραπάνω τρόπους, διαπιστώνουμε ότι
    η εκτέλεση του έχει τα ίδια ακριβώς
    αποτελέσματα που θα είχε και η
    σειριακή εκτέλεση των 3 εντολών:
    l   cal, pwd, ls -la


                                     32
Προσθήκη αλληλεπίδρασης

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

                                   33
    Εκτύπωση μηνυμάτων στην οθόνη
¡   Η εκτύπωση μηνυμάτων στην οθόνη του
    τερματικού μέσω ενός προγράμματος
    κελύφους, γίνεται με την εντολή echo.
¡   Η echo ακολουθείται από το μήνυμα που
    θέλουμε να τυπωθεί.
¡   Απλό κείμενο,
    l   π.χ. echo Hello world
¡   Μεταβλητή, οπότε η echo τυπώνει στην
    οθόνη τα περιεχόμενα της.
    l   Π.χ. echo $ΡΑΤΗ

                                            34
    Εκτύπωση μεταβλητών

¡   Για να τυπώσουμε τα περιεχόμενα μιας
    μεταβλητής με την εντολή echo, θα
    πρέπει πριν από το όνομα της
    μεταβλητής να προσθέσουμε τον
    χαρακτήρα $.
¡   Η echo PATH τυπώνει τη λέξη PATH
¡   Η echo $PATH τυπώνει τα περιεχόμενα
    της μεταβλητής με όνομα PATH

                                       35
    Ανάγνωση χαρακτήρων
¡   Η ανάγνωση χαρακτήρων από το
    πληκτρολόγιο γίνεται με την εντολή read.
¡   Σύνταξη:
read Μεταβλητή
¡   Μεταβλητή είναι το όνομα μιας μεταβλητής
    (νέας ή υπάρχουσας), στην οποία
    αποθηκεύεται η συμβολοσειρά (string) που
    πληκτρολογεί ο χρήστης.
read NAME
                                               36
Παράδειγμα Εισόδου/Εξόδου

¡   Πρόγραμμα κελύφους, το οποίο θα
    ζητάει από το χρήστη να
    πληκτρολογήσει μία εντολή του
    UNIX και το όνομα ενός αρχείου και
    θα εκτελεί την εντολή
    ανακατευθύνοντας τα αποτελέσματα
    της στο αρχείο που όρισε ο χρήστης


                                     37
 Πρόγραμμα κελύφους

echo Please type a command:
              Τοποθετούμε στη μεταβλητή
read COM
                    Τυπώνουμε
              COM αυτά που θα ένα
                    προτρεπτικό μήνυμα
              πληκτρολογήσει ο χρήστης
echo Now type the name of a file:
                  Τυπώνουμε ένα
read FN      Εκτελούμε την εντολή που
                  προτρεπτικό μεταβλητή
             Τοποθετούμε στη μήνυμα
             FN αυτά που μεταβλητή COM
             υπάρχει στην θα
$COM > $FN   και ανακατευθύνουμε
             πληκτρολογήσει ο χρήστης
             την έξοδο της στο αρχείο που
             υπάρχει στη μεταβλητή FN
                                       38
    Παραμετροποίηση των
    προγραμμάτων κελύφους
¡   Ένα πρόγραμμα κελύφους μπορεί να δέχεται
    είσοδο από το πληκτρολόγιο και έτσι να
    παραμετροποιείται η λειτουργία του.
¡   Ένας εναλλακτικός τρόπος, είναι η
    προσθήκη παραμέτρων (ή ορισμάτων) στο
    prompt του UNIX κατά την εκτέλεση του
    προγράμματος.
¡   Π.χ. εντολή ls
    l   Πρόγραμμα γραμμένο στη γλώσσα
        προγραμματισμού C, το οποίο μπορεί να δέχεται
        παραμέτρους κατά την εκτέλεση του (π.χ. ls -la).

                                                      39
    Παραμετροποίηση των
    προγραμμάτων κελύφους

¡   Όταν εκτελούμε ένα πρόγραμμα στο UNIX
    αυτόματα το κέλυφος δημιουργεί ένα σύνολο
    από μεταβλητές στις οποίες δίνει ως τιμή το
    όνομα της εντολής που εκτελέσαμε και τις
    παραμέτρους, οι οποίες συνοδεύουν την
    εντολή.
¡   Τις μεταβλητές αυτές μπορούμε να τις
    χρησιμοποιούμε μέσα στα scripts και έτσι να
    τα παραμετροποιούμε χωρίς να χρειάζεται
    καμία επιπλέον διεργασία από μέρους μας.
                                              40
    Παραμετροποίηση των
    προγραμμάτων κελύφους
¡   Τα ονόματα αυτών των μεταβλητών είναι:
    l   0 για το όνομα της εντολής,
    l   1 για το πρώτο όρισμα,
    l   2 για το δεύτερο όρισμα
    l   κ. ο. κ.
$ grep Hallo greetings.txt
¡ Το κέλυφος αυτόματα δημιουργεί 3
  μεταβλητές με ονόματα τους αριθμούς από το
  0 μέχρι το 2 και αναθέτει τις τιμές:
    l   0 = grep
    l   1 = Hallo
    l   2 = greetings.txt
                                             41
    Παραλλαγή Παραδείγματος
    Κελύφους
¡ Το όνομα της εντολής και το όνομα του
  αρχείου δεν διαβάζονται από το πληκτρο-
  λόγιο την ώρα της εκτέλεσης, αλλά περνιού-
  νται ως παράμετροι στο prompt του UNIX.
¡ Το πρώτο όρισμα του προγράμματος περιέχει
  το όνομα της εντολής και το δεύτερο το
  όνομα του αρχείου
¡ Το πρόγραμμα απλοποιείται στην εντολή:
$1 > $2
¡ Έστω rd.sh το αρχείο στο οποίο
  αποθηκεύεται το script
                                          42
    Παραλλαγή Παραδείγματος
    Κελύφους - Πρόβλημα
¡ Θέλουμε να εκτελέσουμε την εντολή ls -la:
$ rd.sh ls –la out.txt
    l   Δεν θα έχει τα αναμενόμενα αποτελέσματα.
¡   Το κενό ανάμεσα στην λέξη ls και στη -la
    ερμηνεύεται ως αλλαγή παραμέτρου
¡   Ανάθεση τιμών στις μεταβλητές:
    l   0   =   rd.sh
    l   1   =   ls
    l   2   =   -la
    l   3   =   out.txt
¡   Το πρόγραμμα θα εκτελέσει την εντολή ls και
    θα ανακατευθύνει τα αποτελέσματα της σε ένα
    αρχείο με όνομα '-la'
                                                   43
 Παραλλαγή Παραδείγματος
 Κελύφους - Λύση
¡ Τοποθέτηση της εντολής ls –la μέσα σε
  εισαγωγικά, έτσι ώστε το κέλυφος να την
  ερμηνεύσει ως μία συμβολοσειρά.
$ rd.sh ‘ls –la’ out.txt
¡ Ανάθεση τιμών:
    l   0 = rd.sh
    l   1 = ls –la
    l   2 = out.txt
¡ Η εντολή $1 > $2 που περιέχεται στο script,
  αντικαθίσταται κατά την εκτέλεση με την
ls –la > out.txt
                                            44
Διακλάδωση

¡   Υπάρχουν εντολές με τις οποίες
    μπορούμε να τροποποιούμε την
    ροή εκτέλεσης του προγράμματος
    αν συμβεί κάποιο γεγονός.
¡   Οι εντολές που επιτρέπουν
    διακλαδώσεις στη ροή εκτέλεσης
    του προγράμματος κελύφους είναι
    η if και η case.


                                      45
     Εντολή if – Σύνταξη - Σημασία
                   ¡   Αρχικά εκτελείται η εντολή
if εντολή 1
                       1.
then               ¡   Αν το αποτέλεσμα είναι
                       επιτυχές (επιστροφή
 ομάδα εντολών 1       αριθμού 0), τότε
                       εκτελούνται οι εντολές της
                       ομάδας εντολών 1.
else               ¡   Αν το αποτέλεσμα δεν είναι
                       επιτυχές (επιστροφή
 ομάδα εντολών 2       κάποιου άλλου αριθμού),
                       τότε εκτελείται η ομάδα
fi                     εντολών 2.
                                             46
    Εντολή if – Εναλλακτικά
¡ Το τμήμα else της if μπορεί να παραλειφθεί,
  οπότε η εντολή απλοποιείται στην:
if εντολή 1
then
  ομάδα εντολών 1
fi
¡ Αν η εντολή 1 εκτελεστεί επιτυχώς,
  εκτελείται και η ομάδα εντολών 1
¡ Στην αντίθετη περίπτωση η ομάδα εντολών 1
  παραλείπεται.
                                           47
    Εντολή if – Παράδειγμα 1
¡ Το ακόλουθο script στέλνει το αρχείο results
  στον χρήστη nick μέσω email
¡ Αν η αποστολή του μηνύματος είναι επιτυχής,
  διαγράφει το αρχείο results από το δίσκο:
if mail nick < results
then
  rm –f results
  echo Η αποστολή του μηνύματος ήταν
  επιτυχής!
else
  echo Αδυναμία αποστολής του μηνύματος!
fi
                                           48
    Λογικές Συνθήκες
¡   Πολλές φορές επιθυμούμε να αλλάζει η ροή
    εκτέλεσης ανάλογα με τη τιμή κάποιας
    λογικής πρότασης και όχι ανάλογα με την
    έκβαση της εκτέλεσης κάποιας εντολής.
    l   Π.χ. A > 5 ή ΝΑΜΕ = ‘Peter’
¡   Υπάρχει στο UNIX η εντολή test η οποία
    ελέγχει την συνθήκη που την ακολουθεί
    l   Τερματίζει επιτυχώς (επιστρέφει 0) αν η συνθήκη
        είναι αληθής
    l   Αλλιώς επιστρέφει 1 (ανεπιτυχής)
¡   Ο έλεγχος που ακολουθεί την εντολή test
    μπορεί να είναι αριθμητικός, αλφαριθμητικός
    ή έλεγχος αρχείων
                                                          49
 Αριθμητικοί έλεγχοι

  Έλεγχος   Αληθεύει αν          Παράδειγμα
N1 –eq N2   Ν1=Ν2         test   $NUM –eq 0
N1 –ne N2   Ν2≠Ν2         test   $NUM –ne $NUM2
N1 –gt N2   Ν1>Ν2         test   $NUM –gt 1000
N1 –ge N2   Ν1≥Ν2         test   $NUM –ge 10
N1 –lt N2   Ν1<Ν2         test   $NUM –lt 30
N1 –le N2   Ν1≤Ν2         test   $NUM –le 0



                                             50
       Αλφαριθμητικοί έλεγχοι
    Έλεγχος       Αληθεύει αν        Παράδειγμα
–z S1         Το μέγεθος του S1 test –z $NUM
              είναι 0
-n S1         Το μέγεθος του S1 test –n $1
              δεν είναι 0
S1 = S2       Το S1 είναι ίδιο   test $1 =
              με το S2             ‘Hallo’
S1 !=         Το S1 διαφέρει     test $1 != $2
  S2          από το S2
S             Το S δεν είναι το test $3
              κενό string
                                                  51
  Έλεγχοι αρχείων
Έλεγχος        Αληθεύει αν            Παράδειγμα
-a FILE Το FILE υπάρχει           test –a mydocs.txt
-r FILE Το FILE μπορεί να         test –r mydocs.txt
          διαβαστεί
-w FILE Το FILE μπορεί να         test –w mydocs.txt
        τροποποιηθεί
-x FILE Το FILE μπορεί να         test –x mydocs.txt
          εκτελεστεί
-f FILE Το FILE είναι αρχείο      test –f $1
-d FILE Το FILE είναι κατάλογος   test –d $1
-h FILE Το FILE είναι σύνδεσμος   test –h $1
-s FILE Το μέγεθος του FILE       test –s $2
        είναι μεγαλύτερο από το                    52
Εντολή if – Παράδειγμα 2

¡   Το ακόλουθο script δέχεται σαν
    παράμετρο το όνομα ενός αρχείου
    και έναν αριθμό
¡   Ταξινομεί το αρχείο με αλφαβητική
    σειρά αν ο αριθμός είναι 1 και με
    αντίστροφη αλφαβητική σειρά αν ο
    αριθμός είναι 2.



                                        53
  Εντολή if – Παράδειγμα 2
if test –a $1
then                                Υπάρχει το αρχείο –
   if test $2 –eq 1                   1η παράμετρος?
   then
      sort $1 > temp                Η 2 παράμετρος στο
                         Μετονόμασε τοη αρχείο temp είναι
      rm –f $1               όνομα του αρχείου-1ης
                                          ίση με 1?
      mv temp $1                   παραμέτρου
                              Ταξινόμησε το αρχείο-1η
   else                     Σβήσε το αρχείο-1η παράμετρο
                           παράμετρο και αποθήκευσε στο
      if test $2 –eq 2
      then                          αρχείο temp
         sort –r $1 > temp          Η 2η παράμετρος είναι
         rm –f $1               Ταξινόμησε το αρχείο με
                                           ίση με 2?
         mv temp $1             ανάστροφη σειρά, κ.ο.κ.
      else
         echo Το δεύτερο όρισμα πρέπει να είναι 1 ή 2!
      fi
   fi                            Λάθος τιμή για την 1η 2η
                                    Λάθος τιμή για την
else                                     παράμετρο
                                       παράμετρο
   echo Το αρχείο δεν υπάρχει
fi                                                     54
    Σύνθετοι Έλεγχοι

¡ Η εντολή test μπορεί να δεχτεί εκτός
  από απλούς ελέγχους (π.χ. test $N –
  eq 0) και σύνθετες λογικές
  παραστάσεις που περιέχουν τελεστές
  σύζευξης (&&) και διάζευξης (¦¦).
test $N –gt 0 && test $N –le 10
¡ Επιστρέφει 0 αν η μεταβλητή N
  κυμαίνεται στο διάστημα (0,10] και 1
  αν όχι.
                                    55
    Παράδειγμα Ουράς Εκτύπωσης

¡   Όταν βγαίνουμε με CTRL-C από το
    πρόγραμμα print-queue, τα
    περιεχόμενα του αρχείου pqueue.log
    μένουν αναλλοίωτα
¡   Την επόμενη φορά που εκτελείται το
    print-queue ξανατυπώνονται τα ίδια
    αρχεία
¡   Λύση: Χρήση script


                                         56
    Script για την ουρά εκτύπωσης

¡   Αρχείο pqueue.sh         Εκτέλεση του
                             προγράμματος
print-queue
if test -a pqueue.log
then
                        Αν υπάρχει το αρχείο
                         Όταν τερματιστεί η
    rm pqueue.log         pqueue.log, και
                       εκτέλεση (έστωτότε με
                             σβήνεται
                         CTRL-C) ο έλεγχος
fi
                       εκτέλεσης επιστρέφει
                             στο script
                                          57
    Επανάληψη
¡   Ένας δεύτερος τρόπος αλλαγής της
    ροής εκτέλεσης ενός προγράμματος
    είναι με τη χρήση εντολών
    επανάληψης.
¡   Μπορούμε μέσα σε ένα script να
    εκτελούμε ένα σύνολο από εντολές
    περισσότερες της μία φορές.
¡   Οι εντολές αυτές είναι η for, η while
    και η until.
                                        58
Εντολή for

¡   Υπάρχουν δύο τρόποι χρήσης
    της εντολής for:
    l   α) Με ορισμένο σύνολο τιμών
    l   β) Με τις παραμέτρους εκτέλεσης




                                      59
  for με ορισμένο σύνολο τιμών
for μεταβλητή in σύνολο
do
  Ομάδα εντολών
done
¡ Η ομάδα εντολών θα εκτελεστεί τόσες φορές
  όσο είναι το μέγεθος του συνόλου.
¡ Π.χ., εκτύπωση των άρτιων αριθμών 0 - 10
for I in 0 2 4 6 8 10            Αριθμός 0
                                 Αριθμός 2
do                      Εκτύπωση Αριθμός 4
  echo Αριθμός $I                Αριθμός 6
                                 Αριθμός 8
done                             Αριθμός 10
                                          60
    Χρήση wildcards στην for
¡ Το σύνολο τιμών μιας μεταβλητής
  μπορεί να καθοριστεί με την χρήση
  των wildcards * και ? για ονόματα
  αρχείου
for X in *.txt
do                        Εκτύπωση στην
     echo File: $X        οθόνη όλων των
                          txt αρχείων
     cat $X
done
                                      61
for με τις παραμέτρους εκτέλεσης
for μεταβλητή
do                          Οποιαδήποτε
                            μεταβλητή!
    Ομάδα εντολών
done
¡   Οι τιμές της μεταβλητής είναι αυτές
    των παραμέτρων με τις οποίες έγινε η
    κλήση στο script ($1, $2 κ.τ.λ.).

                                          62
    for - Παράδειγμα
¡   Έστω ότι έχουμε ένα script με όνομα
    sort_file, το οποίο ταξινομεί ένα αρχείο
¡ Θέλουμε να κατασκευάσουμε ένα άλλο script
  (με όνομα multi_sort) το οποίο θα δέχεται
  σαν παραμέτρους πολλά ονόματα αρχείων
  και θα τα ταξινομεί:
for FILE                       Μπορεί να
do                         αντικατασταθεί με
  sort_file $FILE 1       οποιοδήποτε όνομα
                             μεταβλητής!
done
                                               63
    for - Παράδειγμα

¡   Αν εκτελέσουμε την εντολή:
$ multi_sort a.txt b.txt test2.txt
¡   θα εκτελεστούν διαδοχικά οι εντολές:
$ sort_file a.txt 1
$ sort_file b.txt 1
$ sort_file test2.txt 1


                                       64
    Εντολή while
¡  Η σύνταξη της εντολής while είναι:
while εντολή1
do
   ομάδα εντολών 1
done
¡ Η εντολή while εκτελεί την ομάδα
   εντολών 1 επαναληπτικά μέχρι η
   εκτέλεση της εντολής 1 να αποτύχει
   (να επιστρέψει δηλαδή τιμή <> 0).
                                        65
    Εντολή until
¡  Η σύνταξη της εντολής until είναι:
until εντολή1
do
     ομάδα εντολών 1
done
¡    Η εντολή until εκτελεί την ομάδα
     εντολών 1 μέχρι η εκτέλεση της
     εντολής 1 να επιτύχει.
                                        66
    Μέτρηση Συχνότητας Εμφάνισης
    Λέξεων σε Κείμενο – Παραλλαγή 6
¡   Βασίζεται στην Παραλλαγή 5
    l   Διαβάζει ένα αρχείο κειμένου στην είσοδο και
        αποθηκεύει τα αποτελέσματα σε ένα δυαδικό
        αρχείο εξόδου
    l   Π.χ. cw txt1.txt out.dat
    l   Αν το αρχείο εξόδου υπάρχει ήδη, τότε οι λέξεις
        προστίθενται στις ήδη υπάρχουσες και τα
        συνολικά αποτελέσματα αποθηκεύονται ξανά στο
        αρχείο εξόδου
¡   Θέλουμε να έχουμε τη δυνατότητα
    καθορισμού πολλαπλών αρχείων κειμένου με
    wildcards
    l   Π.χ. cw *.txt out.dat
                                                    67
    Δημιουργία script
¡ Δημιουργούμε το αρχείο cw.sh:
for FILE in $1            Η 1η παράμετρος
do                     αντιπροσωπεύει σύνολο
                              αρχείων
  cw5 $FILE $2
                           Χρησιμοποιούμε την
done                          5η παραλλαγή
display $2
                               Εκτυπώνουμε το
¡ Αλλάζουμε τα permissions:     συγκεντρωτικό
                                    αρχείο
$ chmod a+x cw.sh

                                          68
    Εκτέλεση script
¡ Εκτελούμε:
$ cw.sh “*.txt” out.dat
    l   Είναι απαραίτητα τα διπλά quotes γιατί αλλιώς θα
        γίνει μετατροπή των wildcards στο αντίστοιχο
        σύνολο αρχείων στην γραμμή διαταγών και όχι μέσα
        στο script
¡ Η ακόλουθη κλήση:
$ cw.sh *.txt out.dat
    l   είναι ισοδύναμη με:
$ cw.sh file1.txt ... filen.txt out.dat

                                                     69
    Αρχεία batch σε Command Window σε
    λειτουργικό Microsoft Windows

¡ Το προηγούμενο παράδειγμα σε MS-
  Windows αρχείο batch θα γραφόταν ως
  εξής:
for %%x in ( %1 ) do cw5 %%x %2
display %2
¡ Το αρχείο θα ονομαζόταν cw.bat
¡ Δεν χρειάζεται αλλαγή δικαιωμάτων για
  εκτέλεση στα Windows
¡ Το ότι είναι εκτελέσιμο καθορίζεται από
  την επέκταση .bat
                                       70
    Διαφορές batch files από script
    files
¡   Οι μεταβλητές υποδηλώνονται με τον
    χαρακτήρα % αντί του $
¡   Οι παράμετροι της γραμμής εντολών
    υποδηλώνονται με %1, %2, ...
¡   Οι μεταβλητές της FOR χρειάζονται %%
    (π.χ. %%x)
¡   Οι μεταβλητές περιβάλλοντος
    χρειάζονται % πριν ΚΑΙ ΜΕΤΑ το όνομα
    της μεταβλητής (π.χ. %PATH%)
                                         71
  Παράδειγμα μεταβλητής
  περιβάλλοντος

C:\>echo %PATH%
C:\Program Files\Common Files\Roxio
Shared\DLLShared;C:\DJGPP\BIN;C:\Program
Files\Microsoft Visual
Studio\Common\MSDev98\Bin;C:\Program
Files\Microsoft Visual
Studio\Common\Tools;C:\Program
Files\Microsoft Visual
Studio\VC98\bin;C:\BC5\BIN;C:\Program
Files\Java\j2re1.4.2_06\bin;C:\BC5\BIN;
                                      72
    Μεταβλητές περιβάλλοντος
¡ Τις βλέπουμε όπως και στο Unix με
  set
¡ Θέτουμε τιμή στην μεταβλητή

set x=3
¡ Βλέπουμε την τιμή της μεταβλητής

          set x ή echo %x%
¡ Την διαγράφουμε

set x=
                                 73
    Απεικόνιση εντολών batch file

¡ Όταν εκτελείται ένα batch file οι
  εντολές που εκτελούνται απεικονίζονται
  στο παράθυρο εντολών
¡ Για να μην γίνεται αυτό πρέπει να δοθεί
  στην αρχή του batch file:
echo off
for %%x in ( %1 ) do cw5 %%x %2
display %2

                                      74
    Απεικόνιση εντολών batch file

¡ Η εκτέλεση της εντολή echo off θα
  εμφανιστεί στην οθόνη!
¡ Αν θέλουμε η εκτέλεση του batch file
  να είναι εντελώς «αόρατη» τότε πρέπει
  να βάλουμε πριν από το echo off τον
  χαρακτήρα @
@echo off
for %%x in ( %1 ) do cw5 %%x %2
display %2
                                     75
    Απεικόνιση εντολών batch file

¡   Ο χαρακτήρας @ μπορεί να μπει
    μπροστά από οποιαδήποτε εντολή δεν
    θέλουμε να εμφανίζεται
¡   Μπορούμε να μην εμφανίζουμε εντολές
    επιλεκτικά
@for %%x in ( %1 ) do cw5 %%x %2
display %2

                                     76
                                •Προαιρετικό
                                •Αντιστρέφει τη
    Λήψη Αποφάσεων               λογική τιμή

¡ Υπάρχει η εντολή IF-THEN
IF [NOT] ERRORLEVEL number command
    l   Εκτελείται όταν η προηγούμενη εντολή
        επέστρεψε κωδικό εξόδου ίσο ή
        μεγαλύτερο από number
IF [NOT] string1==string2 command
    l   Εκτελείται όταν τα δύο strings (μεταβλητές
        ή σταθερές) είναι ίσα μεταξύ τους
IF [NOT] EXIST filename command
    l   Εκτελείται όταν το αρχείο filename
        υπάρχει
                                                  77
    Batch για την ουρά εκτύπωσης

¡   Αρχείο pqueue.bat          Εκτέλεση του
                               προγράμματος
print-queue
if EXIST pqueue.log del pqueue.log

                       Αν υπάρχει το αρχείο
                     εκτέλεση
  Όταν τερματιστεί η pqueue.log, τότε σβήνεται
(έστω και με CTRL-C) ο έλεγχος
εκτέλεσης επιστρέφει στο script


                                             78
    Διαφορά με UNIX
¡   Όταν πατηθεί CTRL-C για να τερματιστεί το
    print-queue.exe, το λειτουργικό σύστημα
    «κρατάει» την εντολή διακοπής εκτέλεσης
    και για το batch file
¡   Ρωτάει τον χρήστη αν θέλει να διακόψει την
    εκτέλεση του batch file
¡   Αν ο χρήστης απαντήσει yes τότε δεν θα
    εκτελεστούν οι εντολές που βρίσκονται μετά
    από το αρχείο που διακόπηκε
¡   Αν απαντήσει no τότε η εκτέλεση του batch
    συνεχίζεται κανονικά
                                             79
 Οθόνη


^CTerminate batch job (Y/N)? n




                            80
    Εντολή pause

¡   Σταματάει την εκτέλεση ενός batch file
    και περιμένει το πάτημα ενός πλήκτρου
    από τον χρήστη για να συνεχίσει
¡   Τυπώνει και το ανάλογο μήνυμα:
Press any key to continue . . .



                                        81
    Εντολή pause - Παράδειγμα
         for %%x in ( %1 ) do cw5 %%x %2
         echo I will display the result
         pause
         display %2
¡   Στην οθόνη:
C:\>cw.bat text*.txt out.dat
I will display the result
Press any key to continue . . .
   1 Aristotle
   3 CLIPS
   ...
                                       82
    Σχόλια

¡   Για σχόλια μέσα σε batch files
    χρησιμοποιούμε την εντολή rem
rem The following starts the queue
print-queue
rem The following deletes the log
if EXIST pqueue.log del pqueue.log


                                     83
Εντολή goto
¡   Μέσα στα batch files μπορούν να
    οριστούν labels που σηματοδοτούν
    κάποια κομβικά σημεία του
    προγράμματος
¡   Με την εντολή goto label μπορούμε
    να μεταφέρουμε την εκτέλεση του
    batch file σε αυτά τα σημεία



                                        84
  Εντολή goto – Παράδειγμα
if EXIST %1 goto continue
echo File %1 does not exist!      Υπάρχει το αρχείο –
goto end                       Μεταφορά εκτέλεσης
                                    1η παράμετρος?
:continue                       Μεταφορά εκτέλεσης
                                     στο τέλος
                                      αν όλα OK
                                 Η 2η τιμή για την 1η
if %2==1 goto 1                 Λάθος παράμετρος είναι
if %2==2 goto 2                       η ίση με 1?
                                        παράμετρος είναι
                                  Η 2παράμετρο
echo 2nd arg must be 1 or 2!
                                         ίση με 2?
goto end                       Μεταφορά εκτέλεσης η
:1                           Ταξινόμησε το αρχείο-1
                           Μεταφορά εκτέλεσης
                                     στο τέλος
sort %1 > temp                  αν είναι η
                          παράμετρο και 1αποθήκευσε στο
                       Σβήσε το αρχείο-1 παράμετρο
del %1                 Μετονόμασε το αρχείο temp στο
                                   αρχείο temp
rename temp %1             όνομα του αρχείου-1ης
goto end                       Μεταφορά εκτέλεσης
                                παραμέτρου
                               Ταξινόμησε το αρχείο με
                                     εκτέλεσης
                          Μεταφορά στο τέλος
:2
sort –r %1 > temp              ανάστροφη σειρά, κ.ο.κ.
                               αν είναι 2
del %1
rename temp %1
goto end                     Λάθος τιμή για την 2η
:end                               παράμετρο
                                                    85
Κλήση batch από batch

¡   Μέσα από ένα batch file μπορούμε
    να καλέσουμε ένα άλλο batch
¡   Ο έλεγχος εκτέλεσης μεταφέρεται
    από το ένα στο άλλο
¡   Για να επιστραφεί η εκτέλεση πίσω
    στο 1ο batch, όταν το 2ο batch
    τερματίσει, πρέπει η κλήση να γίνει
    με την εντολή call


                                          86
Παράδειγμα call - 1

¡ Αρχείο test-1.bat:
echo Before 2nd batch           Οθόνη
test-2               c:\>test-1
echo After 2nd       Before 2nd batch
                     In 2nd batch
¡ Αρχείο test-2.bat:
echo In 2nd batch


                                  87
Παράδειγμα call - 2

¡ Αρχείο test-1.bat:
echo Before 2nd batch           Οθόνη
call test-2          c:\>test-1
echo After 2nd       Before 2nd batch
                     In 2nd batch
¡ Αρχείο test-2.bat: After 2nd

echo In 2nd batch


                                  88
Αρχεία batch files των Windows

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


                                        89

								
To top