Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Σενάρια φλοιού (Shell scripts)

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Σενάρια φλοιού (Shell scripts)"— Μεταγράφημα παρουσίασης:

1 Σενάρια φλοιού (Shell scripts)
4ο ΕΡΓΑΣΤΗΡΙΟ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

2 Φλοιός (Shell) user shells Kernel Hardware
Είναι το πρόγραμμα που διερμηνεύει (interpreter) τις εντολές που εισάγονται από το πληκτρολόγιο. Οι εντολές είναι δυνατόν να τοποθετηθούν σε ένα αρχείο που ονομάζεται shell script. Κάθε φορά που εισάγεται από το πληκτρολόγιο μια γραμμή το Λ.Σ. χρησιμοποιεί ένα τμήμα του για να αναλύσει το περιεχόμενο της γραμμής, τον command line processor (CLP). Στο UNIX ο CLP είναι εξ ολοκλήρου διαχωρισμένος από το υπόλοιπο Λ.Σ. Kernel Hardware Applications shells user ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

3 terminal-based C shell (tcsh)
Δηλαδή ο CLP γράφεται ως ξεχωριστό πρόγραμμα και κάθε χρήστης επικοινωνεί με ένα αντίγραφο αυτού του προγράμματος. Αυτό το πρόγραμμα από μόνο του είναι ο φλοιός (SHELL). Σε κάθε σύστημα UNIX υπάρχουν τουλάχιστον δύο διαθέσιμοι φλοιοί : Bourne shell (sh) και C-shell (csh) (αναπτύχθηκε στα πλαίσια του BSD Unix). Ωστόσο η γλώσσα που χρησιμοποιείται για την επικοινωνία με καθένα από τους φλοιούς αυτούς είναι διαφορετική. Άλλοι φλοιοί : Korn shell (ksh) terminal-based C shell (tcsh) Bourne again shell (bash) – είναι ο εξ ορισμού φλοιός σε συστήματα linux Ανεξάρτητα από τον φλοιό που χρησιμοποιείται, όλοι έχουν ως στόχο να παρέχουν στο UNIX μια διεπαφή χρήστη (user interface). ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

4 Χαρακτηριστικά φλοιών
Διερμηνεία (interpretation ) και επεξεργασία της γραμμής εντολών Δεσμευμένες λέξεις Μετα-χαρακτήρες φλοιού (wild cards) Πρόσβαση και διαχείριση των εντολών των προγραμμάτων φλοιού Διαχείριση αρχείων :ανακατεύθυνση εισόδου / εξόδου και διασωληνώσεις Υποστήριξη μεταβλητών Καθορισμό ψευδωνύμων (aliases) Έλεγχο του περιβάλλοντος και δημιουργία περιβάλλοντος προσαρμοσμένου στις απαιτήσεις του χρήστη Δημιουργία σεναρίων φλοιού (shell scripts) Προγραμματισμός φλοιού (Shell programming) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

5 Αναζήτηση του shell που χρησιμοποιούμε
Από το prompt του συστήματος ($, %) Mέσω της εντολής ps (processes) $ ps –ef : παράγει πληροφορίες για όλες τις διεργασίες (e) σε πλήρη λίστα (f) Χρησιμοποιώντας το αρχείο /etc/passwd και την εντολή awk: $ awk -F: ‘{ if ($1 == “studin”) print “your shell is: “$7}’ < /etc/passwd your shell is: /bin/bash με χρήση μεταβλητών περιβάλλοντος: $echo $SHELL /bin/bash ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

6 Επιλέγοντας νέο shell $ ls -lF /bin/*sh* (αναζήτηση των διαθέσιμων shells) -r-xr-xr-x 1 stef mkpasswd Jun /bin/tcsh.exe -r-xr-xr-x 1 stef mkpasswd Jan /bin/sh.exe lrwxrwxrwx 1 stef mkpasswd Dec /bin/ksh.exe -r-xr-xr-x 1 stef mkpasswd Oct /bin/bash.exe lrwxrwxrwx 1 stef mkpasswd Dec /bin/csh -> tcsh $ chsh (αλλαγή φλοιού) Changing shell for studin Old shell: /bin/csh New shell: _ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

7 Το περιβάλλον φλοιού (shell environment)
$ env | cat -n 1 PWD=/usr/people/staff/it/stefanos 2 SHELL=/bin/csh 3 TERM=vt100 4 USER=stefanos 5 PATH=/usr/sbin:usr/bsd:/usr/bin:/usr/X11:/usr/freeware/bin:/usr/local/bin:/usr/java/bin: 6 MAIL=/var/mail/stefanos 7 LOGNAME=stefanos 8 EDITOR=/bin/vi 9 SSH2_CLIENT= ….. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

8 Όταν ένας χρήστης κάνει login στο σύστημα τότε το σύστημα καθορίζει ορισμένες από τις μεταβλητές περιβάλλοντος που δείχνουν το home directory, το shell που εκτελείται κλπ Ορισμένες από αυτές τις μεταβλητές υπάρχουν ως πεδία στη γραμμή που αντιστοιχεί στον χρήστη στο password file π.χ. $ grep $USER /etc/passwd | awk -F: ‘{print $6}’ /usr/people/staff/it/stefanos $ grep $USER /etc/passwd | awk -F: ‘{print $5}’ Katsavounis Stefanos ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

9 Αρχεία εκκίνησης στο bash (startup files)
Αρχικά διαβάζεται και εκτελείται το αρχείο /etc/profile , εφόσον αυτό υπάρχει. Το αρχείο αυτό είναι το εξ ορισμού αρχείο διαμόρφωσης φλοιού για οποιονδήποτε χρήστη του συστήματος. Το home directory κάθε χρήστη μπορεί περιέχει ένα ή περισσότερα από τα ακόλουθα bash startup files, τα οποία περιέχουν εντολές που εφαρμόζονται μόνον για την τρέχουσα χρήση του συστήματος: ~/.bash_profile, ~/.bash_login, ~/.profile, ~/bash_rc, και ~/.bash_logout ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

10 Login shell : δημιουργείται κάθε φορά που γίνεται login σε ένα account.
Nonlogin shell : δημιουργείται όταν αρχίζει ένα πρόσθετο bash shell , κατά τη διάρκεια της σύνδεσης του χρήστη, όπως π.χ. όταν ανοίγει ένα terminal window. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

11 Όταν ξεκινά ένα login shell, το bash συμβουλεύεται κατά σειρά ορισμένα από τα παρακάτω αρχεία :
/etc/profile ~/.bash.profile ~/.bash_login ~/.profile Όταν ξεκινά ένα nonlogin shell, το bash συμβουλεύεται μόνον ένα αρχείο εκκίνησης το ~/bashrc. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

12 Επειδή τα login και nonlogin shells χρησιμοποιούν διαφορετικά αρχεία εκκίνησης οι δύο φλοιοί μπορούν να διαφέρουν. Οι περισσότερες διανομές Linux περιέχουν το αρχείο ~/.bash_profile που δημιουργείται αυτόματα και περιέχει ένα σενάριο που εκτελεί αυτόματα τις εντολές που βρίσκονται στο αρχείο ~/.bashrc. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

13 Η προσθήκη μιας εντολής που θα εκτελείται αυτόματα όταν κάθε χρήστης του συστήματος κάνει login πρέπει να γίνεται στο αρχείο /etc/profile. Ωστόσο χρειάζονται δικαιώματα superuser για την επεξεργασία αυτού του αρχείου. Η προσθήκη μιας εντολής που θα εκτελείται όταν ξεκινά ένας login φλοιός για το δικό μας account, πρέπει να γίνει στο αρχείο ~/.bash.profile. Οι εντολές που θα εκτελούνται μόνον μετά την εκτέλεση των εντολών που υπάρχουν στα ~/.bash.profile και ~/.bash_login θα πρέπει να περιλαμβάνονται στο αρχείο ~/.profile. Η προσθήκη μιας εντολής που εκτελείται όταν ξεκινά ένα nonlogin shell, γίνεται στο αρχείο ~/.bashrc. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

14 Παραδείγματα # ~/.profile --
# $Id: .profile,v /02/12 13:33:03 ray Exp ray $ # The personal initialization file, executed for login bourne shells #[ -e /etc/config.d/D ] && echo "~$USER/.profile" 1>&2 if [ -n "$BASH_VERSION" ]; then if [ -r "$HOME/.bashrc" ]; then # login shells are always interactive, are they? . $HOME/.bashrc else [ -r /etc/config.d/shells/bashrc ] && . /etc/config.d/shells/bashrc fi # non-bash 'sh'-users are on their own for now... : # load maintained system-defaults... [ -r /etc/config.d/shells/profile ] && . /etc/config.d/shells/profile # load user-defaults [ -r $HOME/.profile-private ] && . $HOME/.profile-private # personal additions and overrides should preferrably be placed in this last # file, but may nevertheless be appendend below, e.g. ... #export LANG=is_IS.ISO ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

15 # $Id: .bashrc,v 1.2 1999/02/12 13:32:54 ray Exp ray $
# The individual per-interactive-shell startup file for bash #[ -e /etc/config.d/D ] && echo "~$USER/.bashrc: \$-='$-'" 1>&2 # load maintained system-defaults... (NB: $HOME/.profile, i.e. # /etc/config.d/shells/profile) depend on this one!!!) [ -r /etc/config.d/shells/bashrc ] && . /etc/config.d/shells/bashrc # load user-defaults [ -r $HOME/.bashrc-private ] && . $HOME/.bashrc-private # personal additions should preferrably be placed in the above file, # but may nevertheless be appendend below... ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

16 Aliases (ψευδώνυμα) $ ls $ alias ls ‘ls -CF’ $ alias DIR ‘ls -lF’
$ alias REN ‘mv’ $ alias COPY ‘cp -i’ $ alias DEL ‘rm -i’ $ alias COPY cp -i DEL rm -i DIR ls -lF REN mv ls ls -CF ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

17 Prompts [08:13:40][stefanos@aetos:~]$
SAVE=${PS1} η τιμή του SAVE ότι και το PS1 π.χ. \s-\v$ PS1=$ το prompt είναι το $ PS1=$SAVE – επαναφορά του αρχικού prompt t =current time (24 hours) u =username h =hostname w =current working directory ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

18 Σενάρια φλοιού (shell scripts)
Ονομάζονται και διαδικασίες (procedures) κελύφους και επιτρέπουν ένα χρήστη να προσαρμόζει το περιβάλλον εργασίας του, εμπλουτίζοντάς το με νέες εντολές. Τα σενάρια φλοιού όταν είναι μικρά, γράφονται και εγκαθίστανται εύκολα π.χ. $ cat <<EOF >dir ls –aCF EOF chmod +x dir Η εντολή αυτή αντιγράφει τη 2η γραμμή στο αρχείο dir, η εντολή ls ορίζει τι ακριβώς θα κάνει η dir και η εντολή chmod απονέμει την άδεια προσπέλασης για εκτέλεση στο αρχείο dir (απαραίτητη προϋπόθεση για να εκτελεστεί ένα σενάριο φλοιού) Εκτέλεση του script : $./dir ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

19 1ο παράδειγμα σεναρίου φλοιού
#!/bin/bash # My first script echo "Hello World!“ Όταν θα εκτελεστεί στο aetos.it.teithe.gr #!/usr/bin/bsh ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

20 2ο παράδειγμα script file loginfo (πρέπει να είναι executable):
echo “The current date and time: \c” date echo “The number of users: \c” who | wc -l # count number of lines echo “personal info: \c”); who am i exit 0 $chmod +x loginfo $loginfo The current date and time: Thursday October 10 … The number of users: 7 Personal info: lseiter ttya …. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

21 Ερμηνεία των shell scripts
Όταν το κέλυφος παίρνει μια εντολή που δεν είναι άμεση, δηλ. δεν ανήκει στο σύνολο εντολών που αναγνωρίζει και εκτελεί απευθείας, τότε καλεί τον πυρήνα του και του αναθέτει την εκτέλεση της εντολής. Αυτή η εντολή μπορεί να είναι είτε ένα πρόγραμμα σε εκτελέσιμη μορφή είτε ένα σενάριο φλοιού. Εφόσον είναι σενάριο φλοιού, ο πυρήνας θα πρέπει να επιλέξει έναν φλοιό για να εκτελέσει το σενάριο. Ο τρόπος με τον οποίο θα γίνει η επιλογή κελύφους εξαρτάται από το σύστημα. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

22 Στα περισσότερα συστήματα η 1η γραμμή ενός σεναρίου έχει πάντοτε τη μορφή:
#!shell Όπου shell είναι το πλήρες όνομα της διαδρομής ενός κελύφους που θα χρησιμοποιηθεί για την ερμηνεία του σεναρίου π.χ. #!/bin/bash Ορισμένα συστήματα δεν συμμορφώνονται με τη σύμβαση #! και παρέχουν άλλους τρόπους π.χ. με πρώτο χαρακτήρα το # εννοείται το κέλυφος C ενώ με πρώτο χαρακτήρα το : εννοείται το κέλυφος Bourne. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

23 #!/bin/sh Bourne shell #!/bin/csh C-shell #!/bin/tcsh TC-shell
Η πρώτη γραμμή στο script ορίζει το κέλυφος που θα χρησιμοποιηθεί για την εκτέλεση των εντολών που περιέχει το σενάριο (το ! ακολουθεί αμέσως μετά το # χωρίς ενδιάμεσα κενά) : #!/bin/sh Bourne shell #!/bin/csh C-shell #!/bin/tcsh TC-shell #!/bin/bash BASH shell ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

24 Εμφάνιση του φλοιού που χρησιμοποιείται :
Όλα τα κελύφη παρέχουν την επιλογή –v για να εμφανίζεται στην οθόνη κάθε γραμμή του σεναρίου καθώς αυτό διαβάζεται και την επιλογή –x για να εμφανίζονται οι εντολές, καθώς εκτελούνται. Οι επιλογές αυτές είναι πολύ χρήσιμες για τη συντακτική ανάλυση των εντολών. Εμφάνιση του φλοιού που χρησιμοποιείται : echo $SHELL SHELL είναι η μεταβλητή περιβάλλοντος που κρατά το όνομα του τρέχοντος φλοιού, ενώ $SHELL είναι η τιμή αυτής της μεταβλητής. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

25 Πως γίνεται εκτελέσιμο ένα shell script
Πρέπει στο αρχείο του script να αποδοθεί το δικαίωμα execute (file mode +x) χρησιμοποιώντας την εντολή chmod π.χ. $chmod +x sh_script1 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

26 Δημιουργία ενός shell script
Το 1ο βήμα είναι να βεβαιωθούμε ότι το σενάριο δημιουργείται σε ένα directory που περιλαμβάνεται στο search path (διαφορετικά δεν θα μπορούμε να χρησιμοποιήσουμε το σενάριο ως εντολή): $pwd $echo $PATH $cat new.script # sample shell script echo searching for shell scripts pwd echo “ “ file * | grep script | sed ‘s/:/ /’ | awk ‘{print $1}’ exit 0 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

27 Τι περιέχουν τα προγράμματα φλοιού
Μεταβλητές Λογικές δομές (if, case …) Δομές επανάληψης (while, for, until ) Συναρτήσεις (functions) Σχόλια ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

28 Προγραμματισμός κελύφους
ΜΕΤΑΒΛΗΤΕΣ Μεταβλητές περιβάλλοντος : είναι τμήμα του περιβάλλοντος του συστήματος και δεν χρειάζεται να ορισθούν. Μπορούν να χρησιμοποιηθούν από ένα πρόγραμμα φλοιού ενώ ορισμένες (π.χ. PATH) μπορούν επίσης να τροποποιηθούν. Μεταβλητές φλοιού : ορίζονται, τροποποιούνται και χρησιμοποιούνται σε ένα σενάριο φλοιού. Οι μεταβλητές στον προγραμματισμό κελύφους δεν είναι typecast, δηλ. μπορούν να χρησιμοποιηθούν αδιακρίτως ως αριθμητικές ή αλφαριθμητικές. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

29 Μεταβλητές περιβάλλοντος
Αρχικοποιούνται κατά την εκκίνηση (login) Μεταβιβάζονται σε όλες τις διεργασίες που εκτελούνται από τον τρέχοντα φλοιό (current shell) Χρησιμοποιούνται για την αποθήκευση πληροφοριών που χρειάζεται να γνωρίζουν άλλα προγράμματα Συνήθως τους αποδίδονται αναγνωριστικά με κεφαλαία γράμματα (upper case identifiers) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

30 Μεταβλητές φλοιού Αρχικοποιούνται από τον φλοιό,
Δεν μεταβιβάζονται στις διεργασίες που εκτελούνται από τον τρέχοντα φλοιό, Συνήθως τους αποδίδονται αναγνωριστικά με μικρά γράμματα (lower case identifiers) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

31 Χρήση μεταβλητών σε προγράμματα κελύφους
Για να χρησιμοποιηθεί μια μεταβλητή πρέπει να γνωρίζουμε : πώς να της αποδώσουμε μια τιμή και πώς να έχουμε πρόσβαση στη μεταβλητή αυτή για να γνωρίζουμε την τιμή της. Υπάρχουν 4 τρόποι για να δώσουμε τιμή σε μια μεταβλητή : χρησιμοποιώντας απευθείας εκχώρηση χρησιμοποιώντας την εντολή read χρησιμοποιώντας command-line parameters αντικαθιστώντας την έξοδο μιας εντολής (χρήση μιας ενσωματωμένης εντολής expr μέσω ` `ή περικλείοντας την εντολή σε $( ) ) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

32 1. Απευθείας εκχώρηση τιμής (direct assignment)
myoffice=”Room 301, N.O.C. ” Ο φλοιός ανακτά τις τιμές των μεταβλητών όταν χρησιμοποιηθεί το σύμβολο $ πριν από το όνομα της μεταβλητής: echo “ My address is $my ” echo “ My office is $myoffice” cp current /corporate/info/public/sales corpsales=/corporate/info/public/sales cp current $corpsales ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

33 Για την εκχώρηση τιμής μπορεί να χρησιμοποιηθεί το όνομα της μεταβλητής μέσα σε {}
${PS1}, ${SHELL} Π.χ. $ prompt=${PS1} $echo $prompt \s-\v\$ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

34 Χρήση απλών & διπλών εισαγωγικών
$echo “My host name is $HOSTNAME” My host name is aetos.it.teithe.gr $echo ‘My host name is $HOSTNAME’ My host name is $HOSTNAME ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

35 2. Χρησιμοποιώντας την εντολή read
#!/bin/bash echo -n "Enter some text > " read text echo "You entered: $text" Η επιλογή –n στην echo δεν επιτρέπει την αλλαγή γραμμής. $ read_demo.bash Enter some text > this is some text You entered: this is some text ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

36 Αριθμητικές πράξεις #!/bin/bash first_num=0 second_num=0
echo -n "Enter the first number --> " read first_num echo -n "Enter the second number -> " read second_num echo "first number + second number = $((first_num + second_num))" echo "first number - second number = $((first_num - second_num))" echo "first number * second number = $((first_num * second_num))" echo "first number / second number = $((first_num / second_num))" echo "first number % second number = $((first_num % second_num))" echo "first number raised to the" echo "power of the second number = $((first_num ** second_num))" ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

37 Αριθμητικές Πράξεις με την expr
i=9 j=18 k=`expr $i + $j` echo $k Προσοχή στα εισαγωγικά!!! ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

38 3. Χρήση Command-Line Parameters
Κάθε φορά που το κέλυφος διερμηνεύει μια εντολή συνδέει ονόματα μεταβλητών σε κάθε στοιχείο της γραμμής εντολών. Ως στοιχεία της γραμμής εντολών θεωρούνται ακολουθίες χαρακτήρων διαχωριζόμενες με κενά ή tab. (χρησιμοποιείστε εισαγωγικά αν πρόκειται χαρακτήρες με ενδιάμεσα κενά να αντιπροσωπεύουν ένα στοιχείο). Οι μεταβλητές που συνδέονται με τα στοιχεία της γραμμής εντολής είναι οι $0, $1, $2, … $9. Αυτές οι 10 μεταβλητές αντιστοιχούν με τις θέσεις των στοιχείων στη γραμμή εντολών και λέγονται παράμετροι θέσης (positional parameters). Το όνομα της εντολής είναι η μεταβλητή $0, Το πρώτο όρισμα ή παράμετρος της εντολής είναι το $1,… ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

39 Shell programming – διαχείριση μεταβλητών
Ειδικές μεταβλητές φλοιού όνομα περιγραφή $1 - $9 αυτές είναι οι παράμετροι θέσης $0 το όνομα της εντολής $# το πλήθος των ορισμάτων θέσης $? Η κατάσταση εξόδου (exit status) της εντολής που εκτελέστηκε τελευταία $$ ο αριθμός διεργασίας του φλοιού $! Ο αριθμός διεργασίας της διεργασίας που εκτελείται στο παρασκήνιο $* ένα string που περιλαμβάνει όλα τα ορίσματα το ίδιο με το $*, εκτός αν χρησιμοποιούνται εισαγωγικά ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

40 $0 επεκτείνεται στο όνομα του φλοιού ή του σεναρίου φλοιού.
$* επεκτείνεται στις παραμέτρους θέσης (positional parameters), ξεκινώντας από την πρώτη. Όταν η επέκταση γίνεται χρησιμοποιώντας διπλά εισαγωγικά, υλοποιείται με μια μόνο λέξη που περιλαμβάνει την τιμή κάθε παραμέτρου που διαχωρίζεται από τις υπόλοιπες τιμές με διαχωριστικό που αντιστοιχεί στον πρώτο χαρακτήρα της ειδικής μεταβλητής ‘IFS'. επεκτείνεται στις παραμέτρους θέσης , ξεκινώντας από την πρώτη. Όταν η επέκταση γίνεται χρησιμοποιώντας διπλά εισαγωγικά, κάθε παράμετρος επεκτείνεται σε μια ξεχωριστή λέξη. $# επεκτείνεται στον αριθμό των παραμέτρων θέσης στο δεκαδικό σύστημα αρίθμησης. $0 επεκτείνεται στο όνομα του φλοιού ή του σεναρίου φλοιού. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

41 Παραδείγματα # Name: showvars
# Purpose: demonstrate command-line variables echo $0 echo $2 $4! echo $3 showvars -s hello “look at me” bart showvars hello bart! look at me ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

42 $testparms a b c d e f g h I j k l
#!/bin/bash # FILE: testparms echo "$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12" echo $* echo $# $testparms a b c d e f g h I j k l a b c d e f g h i a0 a1 a2 a b c d e f g h I j k l 12 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

43 # Name: safrm # Purpose: copy file to directory /tmp and then remove it from the current directory # first copy $1 to /tmp cp $1 /tmp # now remove the file rm $1 safrm abc def ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

44 Εντολές προγραμματισμού στο κέλυφος
for i in λίστα λέξεων; do εντολές, το $i παίρνει διαδοχικά τις τιμές της λίστας λέξεων done Παράδειγμα : #!/bin/bash for i in word1 word2 word3; do echo $i ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

45 Παράδειγμα #!/bin/bash for i in $@; do echo $i Done
Αν το script έχει όνομα for1 τότε : $for1 ww 77 uu ww 77 uu ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

46 Παράδειγμα #!/bin/bash for i in $*; do echo -----------------------
ls –l $i wc –l $i file $i echo done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

47 while συνθήκη; do commands done
Παράδειγμα #!/bin/bash number=0 while [ $number -lt 10 ]; do echo "Number = $number" number=$((number + 1)) done Η εντολή while χρησιμοποιείται στα σενάρια φλοιού για την ανάγνωση αρχείων κειμένου όταν αυτά αποτελούν τα ορίσματα εισόδου των σεναρίων κελύφους ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

48 Η εντολή until #!/bin/bash number=0 until [ $number -ge 10 ]; do
echo "Number = $number“ sleep 1 number=$((number + 1)) done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

49 Η εντολή if if expression; then commands; elif expression; commands …
else fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

50 παράδειγμα με if ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

51 Κάθε εντολή έχει μια επιστρεφόμενη τιμή (output state)
if cat file then echo "file exists“; else echo "file does not exist“; fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

52 if [ -f .bash_profile ]; then echo "You have a .bash_profile." else
echo "Yikes! You have no .bash_profile!" fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

53 Έλεγχος αλφαριθμητικών ( τελεστής = )
#!/bin/bash number=1 if [ $number = "1" ]; then echo "Number equals 1" else echo "Number does not equal 1" fi if [ “$NAME” = “John Doe” -a “$BAL” -gt 5000 ] then echo “ok” else echo “not ok” fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

54 ακυρώνει (αναιρεί) την επιστρεφόμενη τιμή της εντολής
Επιστρεφόμενες τιμές – command1 && command2 εκτελεί τη δεύτερη εντολή αν, και μόνον αν, η πρώτη εντολή είναι επιτυχής, δηλ. επιστρέφει την τιμή 0. – command1 || command2 εκτελεί τη δεύτερη εντολή αν, και μόνον αν, η πρώτη εντολή είναι εσφαλμένη δηλ. δεν επιστρέφει την τιμή 0. - ! command Boolean NOT ακυρώνει (αναιρεί) την επιστρεφόμενη τιμή της εντολής ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

55 Η εντολή test Expression Description -d file
True if file is a directory. -e file True if file exists. -f file True if file exists and is a regular file. -L file True if file is a symbolic link. -r file True if file is a file readable by you. -w file True if file is a file writable by you. -x file True if file is a file executable by you. file1 -nt file2 True if file1 is newer than (according to modification time) file2 file1 -ot file2 True if file1 is older than file2 -z string True if string is empty. -n string True if string is not empty. string1 = string2 True if string1 equals string2. string1 != string2 True if string1 does not equal string2. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

56 Παρατηρήσεις Όταν χρησιμοποιούμε test commands ( [ … ] ) πρέπει να δίνουμε ιδιαίτερη προσοχή στα κενά ανάμεσα στις παραμέτρους της εντολής, διαφορετικά θα υπάρξουν λανθασμένα αποτελέσματα. Για τον έλεγχο των αποτελεσμάτων που προκύπτουν κατά την εκτέλεση μιας εντολής μπορούμε να χρησιμοποιούμε την echo $? που επιστρέφει το αποτέλεσμα της αμέσως προηγούμενης εντολής που έχει εκτελεστεί (0=true, 1=false) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

57 Παράδειγμα #!/bin/bash number=0 echo -n "Enter a number > "
read number echo "Number is $number" if [ $((number % 2)) -eq 0 ]; then echo "Number is even" else echo "Number is odd" fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

58 Χρήση των εντολών if, test
#!/bin/bash echo -n “Enter a filename to check ==>”; read filename if test ! -r $filename then echo “unable to read the file $filename” exit 1 fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

59 Παράδειγμα με if και test
if test -f $filename then echo $filename is a regular file elif test -d $filename echo $filename is a directory elif [ -h $filename ] echo $filename is a symbolic link elif [ -c $filename ] echo $filename is a character special file fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

60 4. Απόδοση τιμής σε μεταβλητή με χρήση ``
# get the size of the file filesize=`ls -ld $filename | cut -c31-41` echo file size is $filesize if [ $filesize -le 100 ] then echo $filename is less than 100 bytes elif [ ($filesize -gt 100 ) -a ( $filesize -lt ) ] echo $filename is greater than 100 bytes but less than bytes fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

61 4. Απόδοση τιμής σε μεταβλητή με χρήση $( )
4. Απόδοση τιμής σε μεταβλητή με χρήση $( ) #!/bin/bash filesize=$(ls -l $1 | cut -c31-41) echo filesize of $1 is $filesize Η χρήση των $( ) είναι ισοδύναμη με αυτή των ` ` ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

62 Η εντολή case case value in pattern 1) command anothercommand ;; pattern 2) command anothercommand ;; esac echo -n "Your Answer: " read ANSWER case $ANSWER in Y* | y*) ANSWER="YES" ;; N* | n*) ANSWER="NO" ;; *) ANSWER="MAYBE" ;; esac echo $ANSWER ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

63 Παράδειγμα στην εντολή case
echo -n "Enter the name of an animal: " read ANIMAL echo -n "The $ANIMAL has " case $ANIMAL in horse | dog | cat) echo -n "four";; man | kangaroo ) echo -n "two";; *) echo -n "an unknown number of";; esac echo " legs." ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

64 Εντολή shift #!/bin/bash
echo "You start with $# positional parameters" # Loop until all parameters are used up while [ "$1" != "" ]; do echo "Parameter 1 equals $1" echo "You now have $# positional parameters" # Shift all the parameters down by one shift done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

65 Παράδειγμα : Διαχείριση περισσότερων από 9 παραμέτρων
#!/bin/bash #shift_demo script: echo "arg1=$1 arg2=$2 arg3=$3" shift $shift_demo one two three four arg1=one arg2=two arg3=three arg1=two arg2=three arg3=four ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

66 ΠΑΡΑΔΕΙΓΜΑΤΑ ΣΕΝΑΡΙΩΝ ΦΛΟΙΟΥ
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

67 1. Εύρεση του login shell #!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then echo "your login shell is the bash (Bourne again shell)" else echo "your login shell is not bash but $SHELL" fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

68 2. Χρήση for, if, test #!/bin/bash for i in $@; do
# check to see if the named file is executable if test -x $i then ls -l $i fi done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

69 3. Χρήση for #!/bin/bash count=0 for i in $(cat testfile); do
count=$((count + 1)) echo "Word $count ($i) contains $(echo -n $i | wc -c) characters" done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

70 4. Απόδοση τιμής με χρήση ``& ανάγνωση τιμών από αρχείο
#!/bin/bash count=0 while read line do username=`echo $line | cut -d: -f1` echo user $count has username $username count=`expr $count + 1` done < /etc/passwd ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

71 5. Χρήση if, test, for #!/bin/bash for filename in $@; do
if [ -f $filename ]; then result="$filename is a regular file" else if [ -d $filename ]; then result="$filename is a directory" fi if [ -w $filename ]; then result="$result and it is writable" result="$result and it is not writable" echo "$result" done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

72 6. Ορισμός και χρήση basename - dirname
#!/bin/bash a=/home/aetos/daily-log.txt echo "Basename of $α = `basename $a`" echo "Dirname of $α = `dirname $a`" echo ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

73 7. Σύγκριση των περιεχομένων 2 directories
#!/bin/bash # cmp_dir - program to compare two directories # Check for required arguments if [ $# -ne 2 ]; then echo "usage: $0 directory_1 directory_2" exit 1 fi # Make sure both arguments are directories if [ ! -d $1 ]; then echo "$1 is not a directory!" if [ ! -d $2 ]; then echo "$2 is not a directory!" ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

74 Συνέχεια παραδείγματος 7
# Process each file in directory_1, comparing it to directory_2 missing=0 for filename in $1/*; do fn=$(basename $filename) if [ -f $filename ]; then if [ ! -f $2/$fn ]; then echo "$fn is missing from $2" missing=$((missing + 1)) fi done echo "$missing files missing" Χρήση ειδικών μεταβλητών!! ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

75 8. Εύρεση μέσου όρου μιας σειράς αριθμών
#!/bin/bash sum=0 num=0 while true; do echo “-n enter a number [0-100] (0 for quit) :”;read score if [ $score –lt 0 ] || [ $score –gt 100 ]; then echo “try again!!” elif [ $score –eq 0 ]; then echo “average = $average” exit 0 else sum=$((sum+score)) num=$((num+1)) average=$((sum/num)) fi done echo “exit – end” ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

76 9. Χρήση των $*, $@ και της shift
#!/bin/bash echo NAME of script is $0 count=1 for name in $*; do echo $count '=>' $name count=$((count+1)) done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

77 10. Χρήση ειδικών παραμέτρων θέσης
#!/bin/bash echo '** Show parameters using **' count=1 for name in do echo $count '=>' $name count=$((count+1)) done echo Show use of shift while [ $# -ne 0 ]; do echo first parameter is $1 shift ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

78 ΛΥΜΕΝΕΣ ΑΣΚΗΣΕΙΣ ΣΤΑ ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

79 ΑΣΚΗΣΗ - 1 Να γραφεί ένα shell script που θα διαβάζει ένα αρχείο και θα το εμφανίζει στην οθόνη γραμμή προς γραμμή. Στην αρχή κάθε γραμμής θα βρίσκεται ο αύξων αριθμός της γραμμής. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

80 Λύση άσκησης - 1 #!/bin/bash if [ $# -eq 0 ]; then
echo “ERROR: usage is: $0 filename” exit 1 fi # read the file line by line count=1 while read line do echo "$count: $line" count=$((count + 1)) done < $1 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

81 ΑΣΚΗΣΗ - 2 Να γραφεί ένα shell script που θα δέχεται το login name ενός χρήστη και θα εμφανίζει πόσες φορές έχει κάνει logged on (χρήση των εντολών who, grep, wc) ΛΥΣΗ #!/bin/bash times=`who | grep $1 | wc –l` echo "$1 is logged on $times times" ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

82 ΑΣΚΗΣΗ - 3 Να γραφεί ένα shell script με όνομα lsdirs που θα εμφανίζει μόνον τα ονόματα των directories στο τρέχον directory. ΛΥΣΗ #!/bin/sh for file in $*/*; do if [ -d $file ] then ls $file fi done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

83 ΑΣΚΗΣΗ - 4 Σε πολλές εκδόσεις του unix υπάρχει ένα όρισμα -i για την εντολή cp έτσι ώστε ο χρήστης να ειδοποιείται για επιβεβαίωση, αν το αρχείο πρόκειται να αντικαταστήσει κάποιο υπάρχον (overwrite). Να γραφεί ένα script με όνομα cpi που θα ειδοποιεί αν είναι απαραίτητο, χωρίς να χρησιμοποιηθεί το όρισμα -i. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

84 ΛΥΣΗ άσκησης - 4 #!/bin/bash if [ -f $2 ]; then
echo -n "$2 exists. Do you want to overwrite it? (y/n)" read yn if [ $yn = "N" -o $yn = "n" ]; exit 0 fi cp $1 $2 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

85 ΑΣΚΗΣΗ - 5 Χρησιμοποιώντας την εντολή if να γραφεί ένα shell script που θα ελέγχει αν ένας χρήστης έχει κάνει login στο σύστημα. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

86 Λύση άσκησης - 5 # test if user in logged in # input: getuser username user=$1 if who | grep -s $user then echo $user is logged in else echo $user not available fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

87 ΑΣΚΗΣΗ - 6 Δίνεται το παρακάτω αρχείο με όνομα netwatch που περιέχει sites που έχουν επισκεφτεί οι χρήστες ενός συστήματος Unix. jamiesob mucus.slime.com tonsloye xboys.funnet.com.fr tonsloye sweet.dreams.com root sniffer.gov.au jamiesob marvin.ls.tc.hk jamiesob never.land.nz jamiesob guppy.pond.cqu.edu.au tonsloye xboys.funnet.com.fr tonsloye janesk horseland.org.uk root tonsloye warez.under.gr tonsloye mucus.slime.com root ftp.ns.gov.au tonsloye xboys.funnet.com.fr root linx.fare.com root crackz.city.bmr.au janesk smurf.city.gov.au jamiesob mucus.slime.com jamiesob mucus.slime.com ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

88 Μια επιτροπή αποφάσισε να δημιουργήσει ένα νέο αρχείο με όνομα netnasties που περιέχει όλα τα sites που θεωρεί απαγορευμένα (prohibited). mucus.slime.com xboys.funnet.com.fr warez.under.gr crackz.city.bmr.au Να γραφεί ένα shell script που θα εντοπίζει τους χρήστες που έχουν επισκεφτεί τα απαγορευμένα sites και θα τους προειδοποιεί για την απόφαση της επιτροπής. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

89 Ένα από τα πρώτα πράγματα που πρέπει να ελεγχθεί είναι η ύπαρξη των δύο αρχείων netnasties και netwatch. #!/bin/bash if [ -f netwatch ] && [ -f netnasties ]; then echo “source files exist" else echo "Can not find one of the data files - exiting" exit 1 fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

90 while read buffer do. user=`echo $buffer | cut -d" " -f1`
while read buffer do user=`echo $buffer | cut -d" " -f1` site=`echo $buffer | cut -d" " -f2` if [ $user = $1 ]; then echo "$user visited $site" fi done < netwatch ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

91 1η Λύση – τα ονόματα χρηστών που ελέγχονται είναι ορίσματα της γραμμής εντολών
#!/bin/bash if [ -f netwatch ] && [ -f netnasties ]; then echo "source files exist" else echo "can not find source files - exiting.." exit 1 fi for checkuser in $*; do while read buffer #user=`echo $buffer | cut -d" " -f1` #site=`echo $buffer | cut -d" " -f2` while read checksite user=`echo $buffer | cut -d" " -f 1` site=`echo $buffer | cut -d" " -f 2` if [ "$user" = "$checkuser" ] && [ "$site" = "$checksite" ]; then echo "$user visited the prohibited site $site" done < netnasties done < netwatch done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

92 2η Λύση Από το αρχείο netwatch δημιουργείται ένα νέο αρχείο με όνομα netset που περιλαμβάνει μόνον τα ονόματα των χρηστών, το καθένα μόνον μία φορά, μέσω της εντολής : sed “s/ .*$//g” netwatch |sort |uniq >netset Η λύση είναι: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

93 if [ -f netwatch ] && [ -f netnasties ]; then
#!/bin/bash if [ -f netwatch ] && [ -f netnasties ]; then echo "source files exist" else echo "can not find source files - exiting.." exit 1 fi while read checkuser do while read buffer #user=`echo $buffer | cut -d" " -f1` #site=`echo $buffer | cut -d" " -f2` while read checksite user=`echo $buffer | cut -d" " -f 1` site=`echo $buffer | cut -d" " -f 2` if [ "$user" = "$checkuser" ] && [ "$site" = "$checksite" ]; then echo "$user visited the prohibited site $site" done < netnasties done < netwatch done <netset ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

94 for checkuser in $(cat netset);
3η λύση Είναι παρόμοια με την προηγούμενη αλλά τα ονόματα χρηστών από το αρχείο netset δημιουργούνται ως αποτέλεσμα της εντολής $(cat netset) : for checkuser in $(cat netset); ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

95 if [ -f netwatch ] && [ -f netnasties ]; then
#!/bin/bash if [ -f netwatch ] && [ -f netnasties ]; then echo "source files exist" else echo "can not find source files - exiting.." exit 1 fi for checkuser in $(cat netset); do while read buffer #user=`echo $buffer | cut -d" " -f1` #site=`echo $buffer | cut -d" " -f2` while read checksite user=`echo $buffer | cut -d" " -f 1` site=`echo $buffer | cut -d" " -f 2` if [ "$user" = "$checkuser" ] && [ "$site" = "$checksite" ]; then echo "$user visited the prohibited site $site" done < netnasties done < netwatch done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

96 ΑΣΚΗΣΗ - 7 Να γραφεί ένα script που θα χρησιμοποιεί το αρχείο /etc/passwd για να εμφανίσει μια λίστα με τους χρήστες του συστήματος στη μορφή: USER #1 = root USER #2 = bin USER #3 = daemon ….. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

97 Λύση άσκησης - 7 #!/bin/bash PASSWORD_FILE=/etc/passwd
n= # User number for name in $(awk ‘ BEGIN {FS=":"} { print $1 } ' < "$PASSWORD_FILE" ) do echo "USER #$n = $name" n=$((n+1)) done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

98 ΑΣΚΗΣΗ - 8 Να γραφεί ένα script που θα διαβάζει ένα text file με χρήση της εντολής awk, θα υπολογίζει και θα εμφανίζει το άθροισμα των τιμών μιας οποιασδήποτε στήλης του text file. To script θα δέχεται ως ορίσματα της γραμμής εντολών το όνομα του text file και τον αριθμό της στήλης. Να γίνονται όλοι οι απαραίτητοι έλεγχοι για τα ορίσματα του script. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

99 Λύση άσκησης - 8 #!/bin/bash ARGS=2 if [ $# -ne "$ARGS" ]; then
echo "Usage: `basename $0` filename column-number" exit 0 fi filename=$1 column_number=$2 # begin awk script awk ' { total += $`"${column_number}«` } END { print total } ' "$filename" # end awk script ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

100 ΑΣΚΗΣΗ - 9 Να γραφεί ένα script που θα βρίσκει τον χώρο που καταλαμβάνουν τα αρχεία του τρέχοντος καταλόγου. (υπόδειξη: χρησιμοποιείστε τις εντολές grep και awk) ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

101 Λύση άσκησης - 9 TotalBytes=0
for Bytes in $(ls -l | grep "^-" | awk '{ print $5 }') do TotalBytes=$((TotalBytes+Bytes)) done if [ $TotalBytes -lt 1024 ]; then TotalSize=$(echo “total size =$TotalBytes”) echo $TotalSize elif [ $TotalBytes -lt ]; then TotalSize=$(echo “total size=`expr $TotalBytes / 1024` Kb) fi ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

102 ΑΣΚΗΣΗ - 10 Να γραφεί ένα script που θα δέχεται ως ορίσματα ένα πρότυπο και ένα νέο πρότυπο. Στη συνέχεια θα αντικαθιστά το παλιό με το νέο πρότυπο σε όλα τα ονόματα αρχείων του τρέχοντος καταλόγου που περιέχουν το παλιό πρότυπο. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

103 1η λύση άσκησης 10 #!/bin/bash criteria=$1 re_match=$2 replace=$3
for i in $( ls *$criteria* ); do src=$i tgt=$(echo $i | sed -e "s/$re_match/$replace/g") mv $src $tgt done ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

104 2η λύση άσκησης 10 #! /bin/bash # filename "rename" utility
if [ $# -ne 2 ] then echo "Usage: `basename $0` old-pattern new-pattern" exit 0 fi number= # Keeps track of how many files actually renamed. for filename in *$1* #Traverse all matching files in directory. do if [ -f "$filename" ] # If finds match... fname=`basename $filename` # Strip off path. n=`echo $fname | sed "s/$1/$2/g"` # Substitute new for old in filename. mv $fname $n # Rename. number=$((number+1)) done if [ "$number" -eq 1 ] echo "$number file renamed." else echo "$number files renamed." ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

105 ΑΣΚΗΣΗ - 11 Να γραφεί ένα script που θα αντικαθιστά κάθε εμφάνιση του χαρακτήρα _ (underscore) στα ονόματα αρχείων του τρέχοντος καταλόγου με τον χαρακτήρα –. Κατά την αντικατάσταση να γίνονται όλοι οι απαραίτητοι έλεγχοι. Στο τέλος θα εμφανίζεται το πλήθος των αρχείων των οποίων το όνομα έχει αλλάξει. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

106 Λύση άσκησης 11 #! /bin/bash
number= # Keeps track of how many files actually renamed. for filename in * #Traverse all files in directory. do echo "$filename" | grep -q " " # Check whether filename if [ $? -eq 0 ]; then fname=$filename # Strip off path. n=`echo $fname | sed -e "s/_ /-/g"` # Substitute underscore for -. if [ ! –f $n ]; then mv "$fname" "$n" # Do the actual renaming. number=$((number+1)) elif [ -f $n ]; then echo “filename $n already exists” fi done if [ $number -gt 0 ] then echo "$number files are renamed." elif [ $number –eq 0’; then echo “no files renamed." ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

107 ΑΣΚΗΣΗ - 12 Να γραφεί ένα script που θα εμφανίζει τη συχνότητα των λέξεων που υπάρχουν σε ένα text file που θα είναι και το μοναδικό όρισμα της γραμμής εντολών. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04

108 Λύση άσκησης 12 #!/bin/bash if [ $# -ne 1 ]; then
echo "Usage: `basename $0` filename" exit 0 fi if [ ! -f "$1" ] # Check if file exists. then echo "File \"$1\" not found." tr ‘A-Z’ ‘a-z’ <$1 |awk –F” “ ‘{for (i=1;i<=NF;i++) word[$i]++} END {for (i in word) print i”,”word[i]}’ | sort ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ – ΕΡΓΑΣΤΗΡΙΟ - 04


Κατέβασμα ppt "Σενάρια φλοιού (Shell scripts)"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google