Λειτουργικά Αριστείδης Ηλίας Συστήματα Ι Φ ρ ο ν τ ι σ τ ή ρ ι ο Shell Scripting
Εισαγωγή Ένα shell script είναι μια λίστα εντολών που εκτελούνται ακολουθιακά Εκτελούνται ανάλογα με το κέλυφος και για το Bash Παράδειγμα vim script1.sh #!/bin/bash #!/bin/bash echo "hello, $USER. I wish to list some files of yours" echo "listing files in the current directory, $PWD" ls # list files To κάνουμε εκτελέσιμο και το εκτελούμε chmod u+x script1.sh./script1.sh USER και PWD είναι ειδικές μεταβλητές που παρέχει το σύστημα (με env εμφανίζονται όλες)
Μεταβλητές Χρήστη Μπορείτε να χρησιμοποιήσετε τις μεταβλητές, όπως σε άλλες γλώσσες προγραμματισμού. Δεν υπάρχουν τύπους δεδομένων. Μια μεταβλητή στο Bash μπορεί να περιέχει έναν αριθμό, έναν χαρακτήρα, μια σειρά χαρακτήρων. Δεν έχετε ανάγκη να δηλώσουμε μια μεταβλητή, μόνο με την εκχώρηση μιας τιμής αναφοράς τους και θα δημιουργηθούν. Οι τοπικές μεταβλητές μπορεί να δημιουργηθεί χρησιμοποιώντας τη λέξη-κλειδί local.
Σχόλια #
Μεταβλητές Χρήστη Μια μεταβλητή χρήστη ορίζεται ως X="hello" (προσοχή, χωρίς spaces) Ανακτάται (καλείται) ως $Χ Παράδειγμα.bash_profile vim.bash_profile hname=`hostname` echo "Welcome on $hname. echo -e "Kernel Details: " `uname -smr` echo -e "`bash --version`" echo -ne "Uptime: "; uptime echo -ne "Server time : "; date Με backticks, μπορεί να τοποθετηθεί το αποτέλεσμα μιας εντολής σε μεταβλητή
Τελεστές Αριθμητικοί Σχεσιακοί Λογικοί Αλφαριθμητικών Ελέγχου αρχείων
Τελεστές Αριθμητικός Τελεστής Περιγραφή Παράδειγμα Χρήσης (για a=10 και b=20) + Πρόσθεση `expr $a + $b` θα δώσει 30 - Αφαίρεση `expr $a - $b` θα δώσει -10 * Πολλαπλασιασμός `expr $a \* $b` θα δώσει 200 / Διαίρεση `expr $b / $a` θα δώσει 2 % Modulo `expr $b % $a` θα δώσει 0 = == Ανάθεση- Εκχωρεί την τιμή που έχει η δεξιά παράσταση στα αριστερά του τελεστή Ισότητα- Συγκρίνει δύο αριθμούς, αν και οι δύο είναι ίδιοι, στη συνέχεια, επιστρέφει αληθές a=$b αναθέτει την τιμή της μεταβλητής b στην a [ $a == $b ] επιστρέφει false!= Διάφορο- Συγκρίνει δύο αριθμούς, αν και οι δύο είναι διαφορετικοί, τότε επιστρέφει αληθές [ $a!= $b ] επιστρέφει true Είναι πολύ σημαντικό να σημειωθεί ότι όλες οι υπό συνθήκη εκφράσεις θα πρέπει να τοποθετούνται μέσα σε αγκύλες με ένα κενό από κάθε πλευρά, π.χ. [ $a == $b ]
Τελεστές Σχεσιακός Τελεστής -eq -ne -gt -lt -ge -le Περιγραφή Ελέγχει αν η τιμή των δύο τελεστέων είναι ίση ή όχι, εάν ναι, τότε η συνθήκη γίνεται αληθής Ελέγχει αν η τιμή των δύο τελεστέων είναι ίσες ή όχι, εάν οι τιμές δεν είναι ίσες τότε η συνθήκη γίνεται αληθής Ελέγχει αν η τιμή του αριστερού τελεστέου είναι μεγαλύτερη από την τιμή του δεξιού, αν ναι, τότε η συνθήκη γίνεται αληθής Ελέγχει αν η τιμή του αριστερού τελεστέου είναι μικρότερη από την τιμή του δεξιού, αν ναι, τότε η συνθήκη γίνεται αληθής Ελέγχει αν η τιμή του αριστερού τελεστή είναι μεγαλύτερη ή ίση με την τιμή του δεξιού, αν ναι, τότε η συνθήκη γίνεται αληθής Ελέγχει αν η τιμή του αριστερού τελεστή είναι μικρότερη ή ίση με την τιμή του δεξιού, αν ναι, τότε η συνθήκη γίνεται αληθής Παράδειγμα Χρήσης (για a=10 και b=20) [ $a -eq $b ] δεν είναι αληθής [ $a -ne $b ] είναι αληθής [ $a -gt $b ] δεν είναι αληθής [ $a -lt $b ] είναι αληθής [ $a -ge $b ] δεν είναι αληθής [ $a -le $b ] είναι αληθής Είναι πολύ σημαντικό να σημειωθεί ότι όλες οι υπό συνθήκη εκφράσεις θα πρέπει να τοποθετούνται μέσα σε αγκύλες με ένα κενό από κάθε πλευρά, π.χ. [ $a <= $b ]
Τελεστές Λογικός Τελεστής Περιγραφή Παράδειγμα Χρήσης (για a=10 και b=20)! NOT [! false ] είναι αληθής -o OR [ $a -lt 20 -o $b -gt 100 ] είναι αληθής -a AND [ $a -lt 20 -a $b -gt 100 ] είναι ψευδής
Τελεστές Αλφαριθμητικός Τελεστής =!= -z -n str Περιγραφή Ελέγχει αν οι τιμές των δύο τελεστές είναι ίσες ή όχι, εάν ναι, τότε η συνθήκη γίνεται αληθής Ελέγχει αν οι τιμές των δύο τελεστές είναι ίσες ή όχι, εάν οι τιμές δεν είναι ίσες τότε η συνθήκη γίνεται αληθής Ελέγχει αν το δεδομένο μέγεθος της συμβολοσειράς είναι μηδέν και εάν είναι, τότε επιστρέφει αληθής Ελέγχει αν το δεδομένο μέγεθος της συμβολοσειράς είναι μη μηδενικό και εάν είναι, τότε επιστρέφει αληθής Ελέγξτε αν str δεν είναι η κενή συμβολοσειρά και εάν είναι κενή επιστρέφει ψευδής Παράδειγμα Χρήσης (για a="abc" και b="efg") [ $a = $b ] δεν είναι αληθής [ $a!= $b ] είναι αληθής [ -z $a ] δεν είναι αληθής [ -z $a ] δεν είναι ψευδής [ $a ] δεν είναι ψευδής
Τελεστές Οι ακόλουθοι τελεστές ελέγχουν διάφορες ιδιότητες που σχετίζονται με τα αρχεία του Unix. Υποθέτουμε ότι έχουμε ένα μεταβλητή αρχείου που περιέχει το όνομα αρχείου "test" του οποίου το μέγεθος είναι 100 bytes και δεν έχει δικαιώματα ανάγνωσης, εγγραφής και εκτέλεσης Τελεστής Ελέγχου Αρχείων -b file -c file -d file -f file Περιγραφή Ελέγχει αν το αρχείο είναι ένα μπλοκ ειδικού αρχείου κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο είναι ένα ειδικό αρχείο χαρακτήρων κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο είναι ένας κατάλογος κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο είναι ένα κανονικό αρχείο, σε αντίθεση με έναν κατάλογο ή ένα ειδικό αρχείο κι αν ναι τότε η συνθήκη γίνεται αληθής Παράδειγμα Χρήσης (για a=10 και b=20) [ -b $file ] είναι ψευδής [ -c $file ] είναι ψευδής [ -d $file ] δεν είναι αληθής [ -f $file ] είναι αληθής
Τελεστές Τελεστής Ελέγχου Αρχείων -g file -k file -p file -t file -u file Περιγραφή Ελέγχει αν το αρχείο έχει group ID (SGID) bit ενεργοποιημένο κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο έχει sticky bit ενεργοποιημένο κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο είναι ένα pipe κι αν ναι τότε η συνθήκη γίνεται αληθής Έλεγχοι αν ο περιγραφέας (descriptor) αρχείου είναι ανοικτός και συνδέεται με ένα τερματικό κι αν ναι, τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο έχει User ID (SUID) bit ενεργοποιημένο κι αν ναι τότε η συνθήκη γίνεται αληθής Παράδειγμα Χρήσης (για a=10 και b=20) [ -g $file ] είναι ψευδής [ -k $file ] είναι ψευδής [ -p $file ] είναι ψευδής [ -t $file ] είναι ψευδής [ -u $file ] είναι ψευδής
Τελεστές Τελεστής Ελέγχου Αρχείων -u file -r file -w file -x file -s file Περιγραφή Ελέγχει αν το αρχείο έχει User ID (SUID) bit ενεργοποιημένο κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο είναι αναγνώσιμο κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο είναι εγγράψιμο κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει αν το αρχείο είναι εκτελέσιμο κι αν ναι τότε η συνθήκη γίνεται αληθής Ελέγχει εάν το αρχείο έχει μέγεθος μεγαλύτερο από 0 κι αν ναι τότε η συνθήκη γίνεται αληθής Παράδειγμα Χρήσης (για a=10 και b=20) [ -u $file ] είναι ψευδής [ -r $file ] είναι αληθής [ -w $file ] είναι αληθής [ -x $file ] είναι αληθής [ -s $file ] είναι αληθής
Τελεστές Τελεστής Ελέγχου Αρχείων -e file Περιγραφή Ελέγχει αν υπάρχει αρχείο και είναι αληθής ακόμα και αν το αρχείο είναι ένας κατάλογος, που όμως να υπάρχει Παράδειγμα Χρήσης (για a=10 και b=20) [ -e $file ] είναι αληθής
Συνθήκες Ελέγχου Ροής Συνθήκες IF if [ condition ] then fi action Εμφωλευμένες if #!/bin/bash year=`date +%Y` if [ $[$year % 400] -eq 0 ]; then echo "This is a leap year. February has 29 days." elif [ $[$year % 4] -eq 0 ]; then if [ $[$year % 100] -ne 0 ]; then echo "This is a leap year, February has 29 days." else echo "This is not a leap year. February has 28 days." fi else echo "This is not a leap year. February has 28 days." fi
Βρόχοι Ο βρόχος for είναι λίγο διαφορετικός από τις κλασικές γλώσσες προγραμματισμού. Βασικά, επιτρέπουν να μετακινηθείτε σε μια σειρά από «λέξεις» μέσα από ένα αλφαριθμητικό. #!/bin/bash for i in 1 2 3 4 5 do done echo "Welcome $i times"
Βρόχοι Η while εκτελεί ένα κομμάτι κώδικα, εάν η έκφραση ελέγχου είναι αληθής, και σταματά μόνο όταν είναι ψευδής ή εμφανίζεται ένα break διάλειμμα στην εκτέλεση του κώδικα. #!/bin/bash COUNTER=0 while [ $COUNTER -lt 10 ]; do done echo The counter is $COUNTER let COUNTER=COUNTER+1
Βρόχοι Ο βρόχος until είναι σχεδόν ίδιος με το βρόχο while, εκτός από το ότι ο κώδικας εκτελείται, ενώ η έκφραση ελέγχου είναι ψευδής. #!/bin/bash COUNTER=20 until [ $COUNTER -lt 10 ]; do done echo COUNTER $COUNTER let COUNTER-=1
Συναρτήσεις Όπως σχεδόν σε οποιαδήποτε γλώσσα προγραμματισμού, μπορείτε να χρησιμοποιήσετε τις συναρτήσεις για να ομαδοποιήσετε κομμάτια κώδικα με ένα πιο λογικό τρόπο ή να χρησιμοποιήσετε αναδρομή Η Δήλωση μιας συνάρτησης γίνεται: function my_func { my_code } Η κλήση μιας συνάρτησης είναι ακριβώς σαν να καλείτε κάποιο άλλο πρόγραμμα, δηλαδή μπορείτε απλά να καλέσετε το όνομά του #!/bin/bash function quit { } exit function hello { } hello quit echo Hello!
Συναρτήσεις Συναρτήσεις με παραμέτρους Η συνάρτηση «e», τυπώνει το πρώτο όρισμα που λαμβάνει Ορίσματα, εντός της συνάρτησης αντιμετωπίζονται με τον ίδιο τρόπο όπως και τα ορίσματα που δίνονται στο script #!/bin/bash function quit { } exit function e { } e Hello e World quit echo $1
Παράδειγμα Τι κάνει το παρακάτω script; #!/bin/bash FILES="$@ for f in $FILES do # if.bak backup file exists, read next file if [ -f ${f}.bak ] then echo "Skiping $f file... continue # read next file and skip cp command fi # no backup file exists, just use cp command to copy file /bin/cp $f $f.bak done