89
Κελύφη, Μεταβλητές και Προγραμματισμός Γλώσσα C & Unix Τμήμα Πληροφορικής, ΑΠΘ B’ εξάμηνο lpis.csd.auth.gr/curriculum/C+Unix/UNCL202.html

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

  • Upload
    trula

  • View
    40

  • Download
    1

Embed Size (px)

DESCRIPTION

Κελύφη, Μεταβλητές και Προγραμματισμός. Γλώσσα C & Unix Τμήμα Πληροφορικής, ΑΠΘ B’ εξάμηνο. lpis . csd . auth . gr / curriculum / C + Unix / UNCL 202. html. Μεταβλητές του κελύφους. - PowerPoint PPT Presentation

Citation preview

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

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

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

lpis.csd.auth.gr/curriculum/C+Unix/UNCL202.html

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

2

Μεταβλητές του κελύφους

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

Όπως σε μια γλώσσα προγραμματισμού

Το κέλυφος παρέχει ένα σύνολο από εντολές με τις οποίες ο χρήστης μπορεί να

δει τις τιμές των μεταβλητών τις αλλάξει να δημιουργήσει δικές του μεταβλητές για να τις

χρησιμοποιεί στα προγράμματα του

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

3

Κοινές μεταβλητές (HOME )

Περιέχει το πλήρες μονοπάτι του home directory του χρήστη.

To home directory είναι ένας κατάλογος στο σύστημα αρχείων του UNIX, στο οποίο ο χρήστης μπορεί να αποθηκεύει τα αρχεία του.

Η τιμή στην μεταβλητή HOME ορίζεται από το κέλυφος κατά τη διάρκεια του login.

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

4

Κοινές μεταβλητές (PATH )

Περιέχει ένα σύνολο από μονοπάτια, χωρισμένα με άνω και κάτω τελείες (:) που ορίζουν τα μονοπάτια στα οποία θα ψάχνει το κέλυφος για εκτελέσιμα αρχεία.

Αν για παράδειγμα υπάρχει το πρόγραμμα calculator στον κατάλογο /users/bob/mybin/ τότε για να μπορεί ο χρήστης να τρέχει το calculator ανεξάρτητα από τον κατάλογο στον οποίο βρίσκεται, θα πρέπει η μεταβλητή PATH να περιέχει και το μονοπάτι /users/bob/mybin.

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

5

Κοινές μεταβλητές (LOGNAME, MAIL )

Η LOGNAME κρατά το login name του χρήστη Ορίζεται αυτόματα από το κέλυφος κατά

την είσοδο του χρήστη στο σύστημα. Η MAIL κρατά το όνομα του αρχείου στο

οποίο αποθηκεύονται τα e-mails που φτάνουν για το χρήστη Το κέλυφος χρησιμοποιεί αυτή τη

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

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

6

Κοινές μεταβλητές (SHELL, TERM )

Η SHELL κρατά το όνομα του κελύφους που χρησιμοποιεί ο χρήστης. Κάθε φορά που ο χρήστης αλλάζει κέλυφος (π.χ.

με την εντολή /bin/csh) ενημερώνεται ανάλογα και η μεταβλητή SHELL.

Η TERM κρατά κάποιες πληροφορίες για τον τύπο του τερματικού που χρησιμοποιεί ο χρήστης. Αυτή η πληροφορία είναι χρήσιμη για

προγράμματα όπως το vi για να προσαρμόζουν την έξοδο τους στις δυνατότητες του τερματικού.

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

7

Εμφάνιση της τιμής των μεταβλητών

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

Η αναφορά στην τιμή μιας μεταβλητής γίνεται προσθέτοντας στην αρχή του ονόματος της μεταβλητής τον χαρακτήρα "$".

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

8

Εμφάνιση της τιμής των μεταβλητών - Παράδειγμα

$ cd $ΗΟΜΕ Έχει ως αποτέλεσμα να μεταφερθούμε στο

home directory του χρήστη. Όταν το κέλυφος συναντήσει τον χαρακτήρα

$ και μετά το όνομα μιας μεταβλητής, τα αντικαθιστά αυτόματα με την τιμή της μεταβλητής.

Αν υποθέσουμε ότι το home directory είναι το /users/bob, το κέλυφος μεταφράζει την εντολή cd $HOME στην εντολή cd /users/bob.

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

9

Εμφάνιση της τιμής των μεταβλητών - echo

Για να τυπώσουμε την τιμή μιας μεταβλητής στην οθόνη χρησιμοποιούμε την εντολή echo η οποία τυπώνει το κείμενο που δέχεται στην είσοδο της.

$ echo Hallo world

Hallo world

$ echo $HOME

/users/bob

$ echo $PATH

/bin/:/usr/local/bin/:/users/bob/:/users/bob/mybin/

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

10

Εμφάνιση της τιμής των μεταβλητών - 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

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

11

Ανάθεση τιμών σε μεταβλητές

Ο χρήστης έχει τη δυνατότητα να αλλάζει τις τιμές των μεταβλητών

Εκτός από αυτές που ορίζονται αυτόματα από το κέλυφος (π.χ. LOGNAME)

Για να αλλάξουμε την τιμή μιας μεταβλητής, στο prompt του UNIX πληκτρολογούμε το όνομα της μεταβλητής, τον χαρακτήρα "=" και την νέα τιμή της μεταβλητής.

$ TERM = vtlOO

$ ΡΑΤΗ = /users/billy/mybin

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

12

Ανάθεση τιμών σε μεταβλητές – μεταβλητή PATH

Η αλλαγή στην τιμή της PATH θα πρέπει να γίνεται πολύ προσεχτικά.

Οι εντολές του UNIX είναι εκτελέσιμα αρχεία που βρίσκονται σε καταλόγους, τους οποίους περιέχει αρχικά η PATH ώστε να μπορεί ο χρήστης να τις εκτελεί.

Συνήθως αυτό που χρειαζόμαστε με την PATH είναι να προσθέσουμε ακόμη ένα μονοπάτι σε αυτά που ήδη περιέχει.

Αυτό γίνεται χρησιμοποιώντας το $ΡΑΤΗ που μεταφράζεται στην τιμή που ήδη έχει η μεταβλητή

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

13

Ανάθεση τιμών σε μεταβλητές – μεταβλητή 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

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

14

Δημιουργία μεταβλητών

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

Δημιουργία μιας μεταβλητής με όνομα MYPLACE και τιμή /users/maria/documents/

$ MYPLACE=/users/maria/documents/

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

15

Συχνό Λάθος

Το σημάδι $ το χρησιμοποιούμε μόνο όταν θέλουμε να χρησιμοποιήσουμε την τιμή μιας μεταβλητής και όχι για ανάθεση τιμής

$ X=2

$ echo $X

2

$ $X=3

bash: 2=3: command not found

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

16

Διαγραφή μεταβλητών

Με τη χρήση της εντολής unset Σύνταξη:

unset μεταβλητή

Παράδειγμα:

unset X

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

17

Το περιβάλλον

Ένα υποσύνολο των μεταβλητών του κελύφους.

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

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

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

18

Το περιβάλλον

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

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

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

19

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

Για να τυπώσουμε τις μεταβλητές του περιβάλλοντος χρησιμοποιούμε την εντολή env.

$ env

HOME=/users/billie

PWD=/users/billie/papers

MAILRC=/users/billie/mail/.mailrc

...

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

20

$ export PAPERS$ envHOME=/users/jimmyPWD=/users/jimmy/papersMAILRC=/users/jimmy/mail/.mailrcPATH=/usr/bin:/usr/local/binPAPERS=/users/jimmy/papers

Συμπερίληψη μεταβλητής στο περιβάλλον

Για να «αναγκάσουμε» το UNIX να συμπεριλάβει μια μεταβλητή στο περιβάλλον, χρησιμοποιούμε την εντολή export.

$ PAPERS=/users/jimmy/papers$ envHOME=/users/jimmyPWD=/users/jimmy/papersMAILRC=/users/jimmy/mail/.mailrcPATH=/usr/bin:/usr/local/bin

Η μεταβλητή PAPERS επειδή ορίστηκε από

τον χρήστη δεν περιλαμβάνεται

αρχικά στο περιβάλλον

Η μεταβλητή PAPERS συμπεριλήφθηκε στο περιβάλλον μετά την

εκτέλεση της εντολής export

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

21

Ιστορικό εντολών

Η εντολή history εμφανίζει στην οθόνη τις τελευταίες εντολές που εκτέλεσε ο χρήστης στο κέλυφος.

$ lsa.txt documents games$ cd games$ lsnfs3 fifa2000$ cd ..$ history112 ls113 cd games114 cd ..115 history

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

22

Ιστορικό εντολών

Ο αριθμός των εντολών που εμφανίζει η εντολή history καθορίζεται από τη τιμή της μεταβλητής HISTSIZE.

Η τιμή της HISTSIZE είναι αρχικά 500 (στο CYGWIN) αλλά μπορεί να αλλάξει.

$ HISTSIZE=10

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

23

Συμπλήρωση ονομάτων αρχείων

Ένα πολύ βολικό χαρακτηριστικό που δίνει στο χρήστη τη δυνατότητα να εργάζεται ευκολότερα και γρηγορότερα.

Σύμφωνα με αυτό, όταν ο χρήστης θέλει να πληκτρολογήσει σε μία εντολή το όνομα ενός αρχείου (π.χ. cat text1.txt) δεν χρειάζεται να πληκτρολογήσει ολόκληρο το όνομα, αλλά μόνο τους πρώτους χαρακτήρες και το πλήκτρο TAB.

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

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

24

Συμπλήρωση ονομάτων αρχείων - Παράδειγμα

$ lsAlaska California Calories Kentucky$ cat A <ΤΑΒ>

‘Ισοδυναμεί με την εντολή cat Alaska. Ένας μόνο χαρακτήρας αρκεί γιατί δεν

υπάρχουν άλλα αρχεία που να ξεκινούν από A.

$ cat Cali <ΤΑΒ> ‘Ισοδυναμεί με την εντολή cat California. Εδώ χρειάζονται 4 χαρακτήρες για να γίνει

η διάκριση από το αρχείο Calories.

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

25

Προγραμματισμός του κελύφους

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

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

26

Προγραμματισμός του κελύφους Ένα πρόγραμμα στο κέλυφος μπορεί

να: εκτελεί ένα σύνολο από εντολές του UNIX

ή άλλες εφαρμογές έχει αλληλεπίδραση με το χρήστη (να

τυπώνει μηνύματα στην οθόνη και να διαβάζει χαρακτήρες από το πληκτρολόγιο)

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

αλλάζει την ροή εκτέλεσης με εντολές διακλάδωσης και επανάληψης κ.α.

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

27

Προγραμματισμός του κελύφους

Προγράμματα κελύφους υπάρχουν στα περισσότερα λειτουργικά συστήματα.

Τα αντίστοιχα στο DOS είναι τα batch files (.bat)

Είναι λιγότερο ευέλικτα και δεν έχουν τις δυνατότητες των shell scripts του UNIX.

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

28

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

Ένα απλό πρόγραμμα κελύφους ομαδοποιεί ένα σύνολο από εντολές του λειτουργικού συστήματος, τις οποίες εκτελεί σειριακά.

Μόλις τερματίσει και η τελευταία εντολή τερματίζει και το πρόγραμμα και ο έλεγχος επιστρέφει στο prompt του UNIX

Αν το πρόγραμμα εκτελέστηκε στο προσκήνιο

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

29

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

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

cal

pwd

ls –la

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

30

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

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

Για να δώσουμε στο αρχείο δικαιώματα εκτέλεσης για όλους τους χρήστες του συστήματος εκτελούμε την εντολή:

$ chmod ugo+x my_first_script.sh

ή

$ chmod a+x my_first_script.sh

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

31

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

Για να εκτελέσουμε τώρα το πρόγραμμα αρκεί να πληκτρολογούμε το όνομα του.

$ my_first_script.sh Αν η μεταβλητή PATH δεν περιέχει το

τρέχοντα κατάλογο, τότε πριν από το όνομα του προγράμματος πληκτρολογούμε τους χαρακτήρες "./".

$./my_first_script.sh

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

32

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

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

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

33

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

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

Δυνατότητα εκτύπωσης μηνυμάτων στην οθόνη και ανάγνωσης χαρακτήρων από το πληκτρολόγιο.

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

34

Εκτύπωση μηνυμάτων στην οθόνη

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

Η echo ακολουθείται από το μήνυμα πουθέλουμε να τυπωθεί.

Απλό κείμενο, π.χ. echo Hello world

Μεταβλητή, οπότε η echo τυπώνει στην οθόνη τα περιεχόμενα της. Π.χ. echo $ΡΑΤΗ

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

35

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

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

Η echo PATH τυπώνει τη λέξη PATH Η echo $PATH τυπώνει τα περιεχόμενα

της μεταβλητής με όνομα PATH

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

36

Ανάγνωση χαρακτήρων

Η ανάγνωση χαρακτήρων από το πληκτρολόγιο γίνεται με την εντολή read.

Σύνταξη:

read Μεταβλητή

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

read NAME

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

37

Παράδειγμα Εισόδου/Εξόδου

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

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

38

Τοποθετούμε στη μεταβλητή COM αυτά που θα πληκτρολογήσει ο χρήστης

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

echo Please type a command:

read COM

echo Now type the name of a file:

read FN

$COM > $FN

Τυπώνουμε ένα προτρεπτικό μήνυμα

Τοποθετούμε στη μεταβλητή FN αυτά που θα πληκτρολογήσει ο χρήστης

Τυπώνουμε ένα προτρεπτικό μήνυμα Εκτελούμε την εντολή που

υπάρχει στην μεταβλητή COM και ανακατευθύνουμε την έξοδο της στο αρχείο που υπάρχει στη μεταβλητή FN

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

39

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

Ένα πρόγραμμα κελύφους μπορεί να δέχεται είσοδο από το πληκτρολόγιο και έτσι να παραμετροποιείται η λειτουργία του.

Ένας εναλλακτικός τρόπος, είναι η προσθήκη παραμέτρων (ή ορισμάτων) στο prompt του UNIX κατά την εκτέλεση του προγράμματος.

Π.χ. εντολή ls Πρόγραμμα γραμμένο στη γλώσσα

προγραμματισμού C, το οποίο μπορεί να δέχεται παραμέτρους κατά την εκτέλεση του (π.χ. ls -la).

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

40

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

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

Τις μεταβλητές αυτές μπορούμε να τις χρησιμοποιούμε μέσα στα scripts και έτσι να τα παραμετροποιούμε χωρίς να χρειάζεται καμία επιπλέον διεργασία από μέρους μας.

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

41

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

Τα ονόματα αυτών των μεταβλητών είναι: 0 για το όνομα της εντολής, 1 για το πρώτο όρισμα, 2 για το δεύτερο όρισμα κ. ο. κ.

$ grep Hallo greetings.txt Το κέλυφος αυτόματα δημιουργεί 3

μεταβλητές με ονόματα τους αριθμούς από το 0 μέχρι το 2 και αναθέτει τις τιμές: 0 = grep 1 = Hallo 2 = greetings.txt

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

42

Παραλλαγή Παραδείγματος Κελύφους

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

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

Το πρόγραμμα απλοποιείται στην εντολή:$1 > $2 Έστω rd.sh το αρχείο στο οποίο

αποθηκεύεται το script

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

43

Παραλλαγή Παραδείγματος Κελύφους - Πρόβλημα

Θέλουμε να εκτελέσουμε την εντολή ls -la: $ rd.sh ls –la out.txt

Δεν θα έχει τα αναμενόμενα αποτελέσματα. Το κενό ανάμεσα στην λέξη ls και στη -la

ερμηνεύεται ως αλλαγή παραμέτρου Ανάθεση τιμών στις μεταβλητές:

0 = rd.sh 1 = ls 2 = -la 3 = out.txt

Το πρόγραμμα θα εκτελέσει την εντολή ls και θα ανακατευθύνει τα αποτελέσματα της σε ένα αρχείο με όνομα '-la'

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

44

Παραλλαγή Παραδείγματος Κελύφους - Λύση

Τοποθέτηση της εντολής ls –la μέσα σε εισαγωγικά, έτσι ώστε το κέλυφος να την ερμηνεύσει ως μία συμβολοσειρά.

$ rd.sh ‘ls –la’ out.txt Ανάθεση τιμών:

0 = rd.sh 1 = ls –la 2 = out.txt

Η εντολή $1 > $2 που περιέχεται στο script, αντικαθίσταται κατά την εκτέλεση με την

ls –la > out.txt

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

45

Διακλάδωση

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

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

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

46

Εντολή if – Σύνταξη - Σημασία

if εντολή 1

then

ομάδα εντολών 1

else

ομάδα εντολών 2

fi

Αρχικά εκτελείται η εντολή 1.

Αν το αποτέλεσμα είναι επιτυχές (επιστροφή αριθμού 0), τότε εκτελούνται οι εντολές της ομάδας εντολών 1.

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

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

47

Εντολή if – Εναλλακτικά

Το τμήμα else της if μπορεί να παραλειφθεί, οπότε η εντολή απλοποιείται στην:

if εντολή 1

then

ομάδα εντολών 1

fi Αν η εντολή 1 εκτελεστεί επιτυχώς,

εκτελείται και η ομάδα εντολών 1 Στην αντίθετη περίπτωση η ομάδα εντολών

1 παραλείπεται.

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

48

Εντολή if – Παράδειγμα 1

Το ακόλουθο script στέλνει το αρχείο results στον χρήστη nick μέσω email

Αν η αποστολή του μηνύματος είναι επιτυχής, διαγράφει το αρχείο results από το δίσκο:

if mail nick < resultsthenrm –f resultsecho Η αποστολή του μηνύματος ήταν επιτυχής!

elseecho Αδυναμία αποστολής του μηνύματος!

fi

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

49

Λογικές Συνθήκες Πολλές φορές επιθυμούμε να αλλάζει η ροή

εκτέλεσης ανάλογα με τη τιμή κάποιας λογικής πρότασης και όχι ανάλογα με την έκβαση της εκτέλεσης κάποιας εντολής. Π.χ. A > 5 ή ΝΑΜΕ = ‘Peter’

Υπάρχει στο UNIX η εντολή test η οποία ελέγχει την συνθήκη που την ακολουθεί Τερματίζει επιτυχώς (επιστρέφει 0) αν η συνθήκη

είναι αληθής Αλλιώς επιστρέφει 1 (ανεπιτυχής)

Ο έλεγχος που ακολουθεί την εντολή test μπορεί να είναι αριθμητικός, αλφαριθμητικός ή έλεγχος αρχείων

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

50

Αριθμητικοί έλεγχοι

Έλεγχος Αληθεύει αν Παράδειγμα

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

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

51

Αλφαριθμητικοί έλεγχοι

Έλεγχος Αληθεύει αν Παράδειγμα

–z S1 Το μέγεθος του S1 είναι 0

test –z $NUM

-n S1 Το μέγεθος του S1 δεν είναι 0

test –n $1

S1 = S2 Το S1 είναι ίδιο με το S2

test $1 = ‘Hallo’

S1 != S2 Το S1 διαφέρει από το S2

test $1 != $2

S Το S δεν είναι το κενό string

test $3

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

52

Έλεγχοι αρχείων

Έλεγχος Αληθεύει αν Παράδειγμα

-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 είναι μεγαλύτερο από το 0

test –s $2

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

53

Εντολή if – Παράδειγμα 2

Το ακόλουθο script δέχεται σαν παράμετρο το όνομα ενός αρχείου και έναν αριθμό

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

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

54

Μετονόμασε το αρχείο temp στο όνομα του αρχείου-1ης

παραμέτρου

Εντολή if – Παράδειγμα 2if test –a $1 then

if test $2 –eq 1 then

sort $1 > temprm –f $1mv temp $1

elseif test $2 –eq 2 then

sort –r $1 > temprm –f $1mv temp $1

elseecho Το δεύτερο όρισμα πρέπει να είναι 1 ή 2!

fifi

elseecho Το αρχείο δεν υπάρχει

fi

Υπάρχει το αρχείο – 1η παράμετρος?

Η 2η παράμετρος είναι ίση με 1?

Ταξινόμησε το αρχείο-1η παράμετρο και αποθήκευσε

στο αρχείο temp

Σβήσε το αρχείο-1η παράμετρο

Η 2η παράμετρος είναι ίση με 2?

Ταξινόμησε το αρχείο με ανάστροφη σειρά, κ.ο.κ.

Λάθος τιμή για την 2η παράμετρο

Λάθος τιμή για την 1η παράμετρο

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

55

Σύνθετοι Έλεγχοι

Η εντολή test μπορεί να δεχτεί εκτός από απλούς ελέγχους (π.χ. test $N –eq 0) και σύνθετες λογικές παραστάσεις που περιέχουν τελεστές σύζευξης (&&) και διάζευξης (¦¦).

test $N –gt 0 && test $N –le 10 Επιστρέφει 0 αν η μεταβλητή N

κυμαίνεται στο διάστημα (0,10] και 1 αν όχι.

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

56

Παράδειγμα Ουράς Εκτύπωσης

Όταν βγαίνουμε με CTRL-C από το πρόγραμμα print-queue, τα περιεχόμενα του αρχείου pqueue.log μένουν αναλλοίωτα

Την επόμενη φορά που εκτελείται το print-queue ξανατυπώνονται τα ίδια αρχεία

Λύση: Χρήση script

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

57

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

Αρχείο pqueue.sh

print-queue

if test -a pqueue.log

then

rm pqueue.log

fi

Εκτέλεση του προγράμματος

Όταν τερματιστεί η εκτέλεση (έστω και με

CTRL-C) ο έλεγχος εκτέλεσης επιστρέφει

στο script

Αν υπάρχει το αρχείο pqueue.log, τότε

σβήνεται

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

58

Επανάληψη

Ένας δεύτερος τρόπος αλλαγής της ροής εκτέλεσης ενός προγράμματος είναι με τη χρήση εντολών επανάληψης.

Μπορούμε μέσα σε ένα script να εκτελούμε ένα σύνολο από εντολές περισσότερες της μία φορές.

Οι εντολές αυτές είναι η for, η while και η until.

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

59

Εντολή for

Υπάρχουν δύο τρόποι χρήσης της εντολής for:

α) Με ορισμένο σύνολο τιμών β) Με τις παραμέτρους

εκτέλεσης

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

60

for με ορισμένο σύνολο τιμών

for μεταβλητή in σύνολο

do

Ομάδα εντολών

done Η ομάδα εντολών θα εκτελεστεί τόσες φορές

όσο είναι το μέγεθος του συνόλου. Π.χ., εκτύπωση των άρτιων αριθμών 0 - 10for I in 0 2 4 6 8 10

do

echo Αριθμός $I

done

Αριθμός 0Αριθμός 2Αριθμός 4Αριθμός 6Αριθμός 8Αριθμός 10

Εκτύπωση

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

61

Χρήση wildcards στην for

Το σύνολο τιμών μιας μεταβλητής μπορεί να καθοριστεί με την χρήση των wildcards * και ? για ονόματα αρχείου

for X in *.txt

do

echo File: $X

cat $X

done

Εκτύπωση στην οθόνη όλων των txt αρχείων

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

62

for με τις παραμέτρους εκτέλεσης

for μεταβλητή

do

Ομάδα εντολών

done

Οι τιμές της μεταβλητής είναι αυτές των παραμέτρων με τις οποίες έγινε η κλήση στο script ($1, $2 κ.τ.λ.).

Οποιαδήποτε μεταβλητή!

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

63

for - Παράδειγμα

Έστω ότι έχουμε ένα script με όνομα sort_file, το οποίο ταξινομεί ένα αρχείο

Θέλουμε να κατασκευάσουμε ένα άλλο script (με όνομα multi_sort) το οποίο θα δέχεται σαν παραμέτρους πολλά ονόματα αρχείων και θα τα ταξινομεί:

for FILE

do

sort_file $FILE 1

done

Μπορεί να αντικατασταθεί με οποιοδήποτε όνομα

μεταβλητής!

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

64

for - Παράδειγμα

Αν εκτελέσουμε την εντολή:

$ multi_sort a.txt b.txt test2.txt

θα εκτελεστούν διαδοχικά οι εντολές:

$ sort_file a.txt 1

$ sort_file b.txt 1

$ sort_file test2.txt 1

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

65

Εντολή while

Η σύνταξη της εντολής while είναι:while εντολή1

do

ομάδα εντολών 1

done Η εντολή while εκτελεί την ομάδα

εντολών 1 επαναληπτικά μέχρι η εκτέλεση της εντολής 1 να αποτύχει (να επιστρέψει δηλαδή τιμή <> 0).

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

66

Εντολή until

Η σύνταξη της εντολής until είναι:

until εντολή1

do

ομάδα εντολών 1

done Η εντολή until εκτελεί την ομάδα

εντολών 1 μέχρι η εκτέλεση της εντολής 1 να επιτύχει.

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

67

Μέτρηση Συχνότητας Εμφάνισης Λέξεων σε Κείμενο – Παραλλαγή 6

Βασίζεται στην Παραλλαγή 5 Διαβάζει ένα αρχείο κειμένου στην είσοδο και

αποθηκεύει τα αποτελέσματα σε ένα δυαδικό αρχείο εξόδου

Π.χ. cw txt1.txt out.dat Αν το αρχείο εξόδου υπάρχει ήδη, τότε οι λέξεις

προστίθενται στις ήδη υπάρχουσες και τα συνολικά αποτελέσματα αποθηκεύονται ξανά στο αρχείο εξόδου

Θέλουμε να έχουμε τη δυνατότητα καθορισμού πολλαπλών αρχείων κειμένου με wildcards Π.χ. cw *.txt out.dat

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

68

Δημιουργία script

Δημιουργούμε το αρχείο cw.sh:for FILE in $1

do

cw5 $FILE $2

done

display $2 Αλλάζουμε τα permissions:$ chmod a+x cw.sh

Χρησιμοποιούμε την 5η παραλλαγή

Η 1η παράμετρος αντιπροσωπεύει σύνολο

αρχείων

Εκτυπώνουμε το συγκεντρωτικό

αρχείο

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

69

Εκτέλεση script

Εκτελούμε:$ cw.sh “*.txt” out.dat

Είναι απαραίτητα τα διπλά quotes γιατί αλλιώς θα γίνει μετατροπή των wildcards στο αντίστοιχο σύνολο αρχείων στην γραμμή διαταγών και όχι μέσα στο script

Η ακόλουθη κλήση:$ cw.sh *.txt out.dat

είναι ισοδύναμη με:

$ cw.sh file1.txt ... filen.txt out.dat

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

70

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

Το προηγούμενο παράδειγμα σε MS-Windows αρχείο batch θα γραφόταν ως εξής:

for %%x in ( %1 ) do cw5 %%x %2display %2 Το αρχείο θα ονομαζόταν cw.bat Δεν χρειάζεται αλλαγή δικαιωμάτων

για εκτέλεση στα Windows Το ότι είναι εκτελέσιμο καθορίζεται

από την επέκταση .bat

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

71

Διαφορές batch files από script files

Οι μεταβλητές υποδηλώνονται με τον χαρακτήρα % αντί του $

Οι παράμετροι της γραμμής εντολών υποδηλώνονται με %1, %2, ...

Οι μεταβλητές της FOR χρειάζονται %% (π.χ. %%x)

Οι μεταβλητές περιβάλλοντος χρειάζονται % πριν ΚΑΙ ΜΕΤΑ το όνομα της μεταβλητής (π.χ. %PATH%)

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

72

Παράδειγμα μεταβλητής περιβάλλοντος

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;

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

73

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

Τις βλέπουμε όπως και στο Unix με set

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

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

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

74

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

Όταν εκτελείται ένα batch file οι εντολές που εκτελούνται απεικονίζονται στο παράθυρο εντολών

Για να μην γίνεται αυτό πρέπει να δοθεί στην αρχή του batch file:

echo off

for %%x in ( %1 ) do cw5 %%x %2

display %2

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

75

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

Η εκτέλεση της εντολή echo off θα εμφανιστεί στην οθόνη!

Αν θέλουμε η εκτέλεση του batch file να είναι εντελώς «αόρατη» τότε πρέπει να βάλουμε πριν από το echo off τον χαρακτήρα @

@echo off

for %%x in ( %1 ) do cw5 %%x %2

display %2

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

76

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

Ο χαρακτήρας @ μπορεί να μπει μπροστά από οποιαδήποτε εντολή δεν θέλουμε να εμφανίζεται

Μπορούμε να μην εμφανίζουμε εντολές επιλεκτικά

@for %%x in ( %1 ) do cw5 %%x %2

display %2

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

77

Λήψη Αποφάσεων

Υπάρχει η εντολή IF-THENIF [NOT] ERRORLEVEL number command

Εκτελείται όταν η προηγούμενη εντολή επέστρεψε κωδικό εξόδου ίσο ή μεγαλύτερο από number

IF [NOT] string1==string2 command Εκτελείται όταν τα δύο strings (μεταβλητές

ή σταθερές) είναι ίσα μεταξύ τους

IF [NOT] EXIST filename command Εκτελείται όταν το αρχείο filename

υπάρχει

•Προαιρετικό•Αντιστρέφει τη λογική τιμή

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

78

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

Αρχείο pqueue.bat

print-queue

if EXIST pqueue.log del pqueue.log

Εκτέλεση του προγράμματος

Όταν τερματιστεί η εκτέλεση (έστω και με CTRL-C) ο έλεγχος εκτέλεσης επιστρέφει στο script

Αν υπάρχει το αρχείο pqueue.log, τότε σβήνεται

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

79

Διαφορά με UNIX Όταν πατηθεί CTRL-C για να τερματιστεί το

print-queue.exe, το λειτουργικό σύστημα «κρατάει» την εντολή διακοπής εκτέλεσης και για το batch file

Ρωτάει τον χρήστη αν θέλει να διακόψει την εκτέλεση του batch file

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

Αν απαντήσει no τότε η εκτέλεση του batch συνεχίζεται κανονικά

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

80

Οθόνη

^CTerminate batch job (Y/N)? n

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

81

Εντολή pause

Σταματάει την εκτέλεση ενός batch

file και περιμένει το πάτημα ενός

πλήκτρου από τον χρήστη για να

συνεχίσει

Τυπώνει και το ανάλογο μήνυμα:

Press any key to continue . . .

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

82

Εντολή pause - Παράδειγμαfor %%x in ( %1 ) do cw5 %%x

%2echo I will display the resultpausedisplay %2

Στην οθόνη:C:\>cw.bat text*.txt out.datI will display the resultPress any key to continue . . . 1 Aristotle 3 CLIPS ...

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

83

Σχόλια

Για σχόλια μέσα σε batch files χρησιμοποιούμε την εντολή rem

rem The following starts the queue

print-queue

rem The following deletes the log

if EXIST pqueue.log del pqueue.log

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

84

Εντολή goto

Μέσα στα batch files μπορούν να οριστούν labels που σηματοδοτούν κάποια κομβικά σημεία του προγράμματος

Με την εντολή goto label μπορούμε να μεταφέρουμε την εκτέλεση του batch file σε αυτά τα σημεία

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

85

if EXIST %1 goto continueecho File %1 does not exist!goto end:continueif %2==1 goto 1if %2==2 goto 2echo 2nd arg must be 1 or 2!goto end:1sort %1 > tempdel %1rename temp %1goto end:2sort –r %1 > tempdel %1rename temp %1goto end:end

Μετονόμασε το αρχείο temp στο όνομα του αρχείου-1ης

παραμέτρου

Εντολή goto – Παράδειγμα

Υπάρχει το αρχείο – 1η παράμετρος?

Η 2η παράμετρος είναι ίση με 1?

Ταξινόμησε το αρχείο-1η παράμετρο και αποθήκευσε

στο αρχείο tempΣβήσε το αρχείο-1η

παράμετρο

Η 2η παράμετρος είναι ίση με 2?

Ταξινόμησε το αρχείο με ανάστροφη σειρά, κ.ο.κ.

Λάθος τιμή για την 2η παράμετρο

Λάθος τιμή για την 1η παράμετρο

Μεταφορά εκτέλεσης αν όλα OK

Μεταφορά εκτέλεσης αν είναι 1

Μεταφορά εκτέλεσης στο τέλος

Μεταφορά εκτέλεσης στο τέλος

Μεταφορά εκτέλεσης αν είναι 2

Μεταφορά εκτέλεσης στο τέλος

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

86

Κλήση batch από batch

Μέσα από ένα batch file μπορούμε να καλέσουμε ένα άλλο batch

Ο έλεγχος εκτέλεσης μεταφέρεται από το ένα στο άλλο

Για να επιστραφεί η εκτέλεση πίσω στο 1ο batch, όταν το 2ο batch τερματίσει, πρέπει η κλήση να γίνει με την εντολή call

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

87

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

Αρχείο test-1.bat:echo Before 2nd batch

test-2

echo After 2nd

Αρχείο test-2.bat:echo In 2nd batch

c:\>test-1

Before 2nd batch

In 2nd batch

Οθόνη

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

88

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

Αρχείο test-1.bat:echo Before 2nd batch

call test-2

echo After 2nd

Αρχείο test-2.bat:echo In 2nd batch

c:\>test-1

Before 2nd batch

In 2nd batch

After 2nd

Οθόνη

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

89

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

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

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