Shell Scripts Shell Script: ένα αρχείο που περιέχει προς τον φλοιό Επανάληψη O φλοιός (shell) µεσολαβεί µεταξύ πυρήνα και χρήστη, εµφανίζει το prompt π.χ. username@hostname:~$, ερµηνεύει, εκτελεί προγράµµατα... είναι και γλώσσα προγραµµατισµού, δέχεται µεταβλητές και έχει δικές του. File globbing: Eίναι η διαδικασία αντικατάστασης των wildcards που είδαµε στο 3 ο εργαστήριο: * Οποιοδήποτε πλήθος χαρακτήρων? Ένα µόνο χαρακτήρα [abx] Ένα χαρακτήρα από αυτούς που είναι µέσα στα [ ] [a-z ] Ένα χαρακτήρα από αυτούς που βρίσκονται µέσα σε αυτό το εύρος [^a-z] Ένα χαρακτήρα από αυτούς που δεν βρίσκονται µέσα σε αυτό το εύρος Με την εντολή echo µπορούµε να ελέγξουµε αν η αντικατάσταση των χαρακτήρων έγινε όπως θέλαµε π.χ. echo rm??ee*.txt O χαρακτήρας tab µπορεί να χρησιµοποιηθεί για συµπλήρωση εντολών π.χ. ls pu<tab> 1 Με το βελάκι (history) µπορούµε να εκτελέσουµε προηγούµενες (!! η προηγ/νη εντολή,!500) O χαρακτήρας ~ αναφέρεται σε home directory (αυτό δείχνει και η µεταβλητή $ΗΟΜΕ) π.χ. ls ~asidirop Ακύρωση της σηµασίας των ειδικών χαρακτήρων O χαρακτήρας \ αναιρεί την µετασηµασία των ειδικών χαρακτήρων πχ. η εντολή echo \$HOME θα δώσει $ΗΟΜΕ echo 4.the process id is\ \ :\ \ \ \$\$ and cwd $PWD # µε πολλά \, είναι λίγο δυσνόητο Μονά ' ' & διπλά εισαγωγικά " " τα µονά εισαγωγικά ακυρώνουν την ειδική σηµασία όλων των χαρακτήρων (εκτός \) ενώ τα διπλά όλων εκτός $, \,!, " πχ. η εντολή µε µονά εισαγωγικά echo '$HOME' (ακυρώνει την σηµασία του $) θα δώσει $ΗΟΜΕ, ενώ µε διπλά echo "$HOME" θα εµφανίσει το home directory π.χ. /home/student/x0506/chgen Mεταβλητές (ανάκτηση των τιµών τους µε το $ ) Για την ανάκτηση τιµής, πριν από την µεταβλητή µπαίνει ο χαρακτήρας $ π.χ. $ΗΟΜΕ, $PATH, $x Για να δείτε όλες τις µεταβλητές σας, δώστε: set more (βάζουµε το more για να τις δούµε ανά σελίδα) Ορισµός µιας µεταβλητής (µε όνοµα π.χ. friend και τιµή Nikos) στο shell : friend=nikos 2 $ friend=nikos $ echo $friend Nikos $ set grep -n friend Η εντολή set εµφανίζει όλες οι µεταβλητές ενώ η εντολή env ή printenv µόνο µεταβλητές περιβάλλοντος (GLOBAL) Μια µεταβλητή είναι µια ετικέτα µε τιµή, που µπορεί να αλλάξει µε το χρόνο, µε το σύστηµα µε τον χρήστη κτλ. 1 Αν δεν υπάρχει άλλο αρχείο από pu, θα τρέξει η εντολή ls public_html/ 2 Xωρίς κενά πριν και µετά το = Μπορούµε να γράψουµε και friend="nikos" αποθηκεύεται πάντα σαν string (π.χ. a=5 ή τιµή του a είναι string) Μόνο ως προς το περιεχόµενο αλλάζουν (a.string β.ακέραιες c.σταθερές(readonly) d.πίνακες) [1]
Ετσι σε ένα shell script µπορεί π.χ. να µπει η µεταβλητή $ΗΟΜΕ που είναι µια αναφορά στο home directory κάθε χρήστη. Τα ανάποδα εισαγωγικά ` ` προκαλούν εκτέλεση του αποτελέσµατος της εντολής Αν γίνει εκχώρηση σε µια µεταβλητή, το αποτέλεσµα θα επιστραφεί στην µεταβλητή π.χ. d=`date` θα εµφανίσει την ηµεροµηνία µε echo $d Mπορώ να χρησιµοποιήσω και $() δηλ. d=$(date) Τοπικές µεταβλητές (local) Οι τοπικές µεταβλητές διαθέσιµες µόνο στο τρέχον shell π.χ. PPID, friend Χρησιµοποιούνται µόνο από τον φλοιό (παραµετροποίηση φλοιού).. και στα shell scripts vassik@aetos:~/xunix/lab7$ echo "This host is named: $HOSTNAME" This host is named: aetos Οι τοπικές µεταβλητές ισχύουν µόνο µέσα στον τρέχοντα φλοιό. Ο φλοιός περνά σε άλλους φλοιούς τις µεταβλητές µε την εντολή export Συνήθεις Tοπικές µεταβλητές: echo $COLUMNS $LINES # κολόνες & γραµµές τερµατικού 106 24 Τοπικές είναι και οι µεταβλητές που ορίζουµε shell όπως η friend. Τι ισχύει για τις µεταβλητές που ορίζουµε µέσα σε ένα Script µας? Το Script µας τρέχει/καλεί νέο shell Γενικές µεταβλητές (global) Οι global µεταβλητές ή µεταβλητές περιβάλλοντος είναι διαθέσιµες σε όλα τα shell π.χ.ηομε,ps1 η µορφή του prompt user host τρέχον_κατάλογος echo $PS1 ${debian_chroot:+($debian_chroot)}\u@\h:\w\$ Oι µεταβλητές περιβάλλοντος χρησιµοποιούνται από τον φλοιό για να περνάει τιµές στις εφαρµογές που καλεί (παραµετ/ση άλλων εντολών). env ή printenv όλες οι µεταβλητές περιβάλλοντος Συνήθεις µεταβλητές Περιβάλλοντος: /bin/bash echo $HΟΜE $LANG $PWD $EDITOR $LESS $SHELL $USER $TERM $PATH Με το set βλέπω όλες τις µεταβλητές τοπικές και γενικές. H µεταβλητή $? $ echo $? ίνει το exit code της εκτελεσθείσας πριν εντολής (0 για ΟΚ, 0 για λάθη) Πράξεις µε µεταβλητές σε µεταβλητές που περιέχουν αριθµό 3 Ορισµένες µαθηµατικές πράξεις µπορούν να γίνουν µε την εντολή expr, που έχει αυστηρό συντακτικό. Το bash µπορεί να κάνει πράξεις και µε το $[ ] ή µε το $(( )) ή µε το let vassik@aetos:~/xunix/lab7$ x=3; y=4 vassik@aetos:~/xunix/lab7$ echo $x+$y 3+4 vassik@aetos:~/xunix/lab7$ echo $[x+y] 7 vassik@aetos:~$ expr $x + $y 7 ARITHMETIC EVALUATION ( πράξεις +,-,*,/) γίνoνται µε την expr ή µε χρήση $[ ] ή $(( )) 3 Πως θα ελέγξετε αν µια µεταβλητή π.χ. x=13abc έχει µόνο αριθµούς και δεν περιέχει κάποιο γράµµα? echo $x egrep '^[0-9]+$' wc -l #(ενας τροπος) εµφανίζω την µεταβλητή, ψαχνω και µετράω γραµµές Aν µε την παραπάνω εντολή, το αποτέλεσµα είναι 1 (µια γραµµή) σηµαίνει ότι έκανε match το pattern Aν είναι 0 δεν το βρήκε, άρα το x δεν περιέχει ένα αριθµό. [2]
Shell startup scripts Αυτά τα αρχεία εκτελούνται όταν ξεκινά ένα shell ο χρήστης και µερικά βρίσκονται στο home directory. Σε αυτά µπαίνουν όπως ορισµός τoπικών µεταβλητών πχ $PS1 (prompt), µεταβλητών περιβάλλοντος πχ $PATH, alias (ψευδώνυµα) Στα login shells εκτελούνται τα ακόλουθα startup scripts /etc/prole ~/.prole 4 Για να τα δείτε δώστε π.χ. cat /etc/prole cat ~/.prole ~/.bashrc /etc/bashrc.~/.bash* Στα scripts les, σχόλια ανά γραµµή µπαίνουν µε το # ηµιουργία και εκτέλεση Shell script Στο αρχείο $ΗΟΜΕ/.prole µπαίνουν, που θέλουµε να εκτελούνται στην αρχή κάθε σύνδεσής µας. (Μπορεί να επαναορίσει κάποια global settings του /etc/prole ). Σε κάθε γραµµή ενός shell script µπαίνει µια µόνο εντολή (εκτός και αν βάλουµε ; ) ηµιουργούµε αρχείο µε όνοµα showdate µε 2 "echo Simera einai:"; date προς το shell (άρα script) Πατάτε Ctrl+C vassik@aetos:~$ cat > showdate echo "Simera einai:"; date ^C vassik@aetos: Μπορούµε να το εκτελέσουµε : 1. Με την εντολή sh vassik@aetos:~$ sh showdate 2. Nα το κάνουµε εκτελέσιµο και να το τρέξουµε vassik@aetos:~$./showdate Για να γίνει εκτελέσιµο ένα script αρχείο (πχ το test1) πρέπει να έχει δικαιώµατα/mode +x (να έχει +r) ΑΡΧΕΙΟ test1 #! /bin/sh #scriptname: test1 echo -n "Enter your name: " read NAME echo "OK! Hello $NAME" vassik@aetos:~/xunix/lab7$ chmod +x test1 vassik@aetos:~/xunix/lab7$./test1 Enter your name: vassik OK! Hello vassik To αρχείο test1 έστω ότι το φτιάχνουµε µε vi test1 ή µε vim 5 test1 (ή αν είναι µικρό και µε cat >test1) Η πρώτη γραµµή σε ένα script είναι οδηγία 6 για το πώς θα χειριστεί το shell το script π.χ.: #! /bin/sh (εκτελεί bourne shell) ή #! /bin/bash (bash shell) ή άλλο shell H τελευταία γραµµή σε ένα script µπορεί να είναι, το exit status του script ($ echo $? ) exit 0 Η εντολή echo που ξαναεµφανίζει αυτά που τις δίνουµε, µε την option -n δεν αλλάζει γραµµή µετά το µήνυµα (υπενθυµίζεται ότι στην εντολή echo γίνονται όλες οι απαραίτητες αντικαταστάσεις πριν εµφανιστεί το µήνυµα). Για την ανάγνωση δεδοµένων από το πληκτρολόγιο βάζουµε την εντολή : read Για να το εκτελέσουµε δίνουµε όλο το path έτσι π.χ. αν βρίσκεται στο τρέχον directory δίνω./test1 αλλά µπορώ και να δώσω όλο το ~/test1 4 Μέσα στο.prole αναφέρεται if [ -f "$HOME/.bashrc" ] ; then ;. "$HOME/.bashrc" ; δηλ. αν υπάρχει το αρχείο $ΗΟΜΕ /.bashrc, να το τρέξει (µε τελεία ον_αρχείου το τρέχει στο ίδιο shell) 5 Για να ενεργοποιήσετε syntax highlighting στον vim βάλτε την εντολή :sy enable 6 Oταν το # βρίσκεται στην πρώτη γραµµή του αρχείου και ακολουθείται από! τότε δεν είναι σχόλιο αλλά εντολή προς εκτέλεση (π.χ. #! /bin/sh αυτό προφέρεται "Hash-Bang" or "She-Bang"). [3]
To αρχείο.prole # ~/.prole: executed by the command interpreter for login shells. # This le is not read by bash(1), if ~/.bash_prole or ~/.bash_login # exists. # see /usr/share/doc/bash/examples/startup-les for examples. # the les are located in the bash-doc package. # the default umask is set in /etc/prole; for setting the umask # for ssh logins, install and congure the libpam-umask package. #umask 022 # if running bash if [ -n "$BASH_VERSION" ]; then # include.bashrc if it exists if [ -f "$HOME/.bashrc" ]; then. "$HOME/.bashrc" # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" echo "GEIA SOU Vassi" # Μy message Mπορώ στο τέλος του (ή στο.bashrc) να προσθέσω ένα δικό µου µήνυµα Αν µετρήσουµε τις γραµµές του, έχει λιγότερες γραµµές κώδικα από ότι οι άλλες alllines=` cat.prole wc -l ` othlines=` cat.prole egrep '# ^$' wc -l ` echo "Synolo Grammwn:$allLines SxoliaKtl:$[allLines-othLines] grammes" Synolo Grammwn:26 SxoliaKtl:12 grammes Σκριπτάκια 9 ης Εργασίας #Μονά-ζυγά ~vassik/bin/odd #! /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" echo "Number is odd" exit 0 if εντολή then κενό (αλλιώς δεν δουλεύει) if [ $num -eq 0 ] #num=0 if [ $num -ne 0 ] #num 0 [ $num -gt 0 ] >0 [ $num -lt 0 ] <0 [ $num -ge 0 ] >=0 [ $num -le 0 ] <=0 1.Μετατρέψτε το ώστε να τρέχει συνεχώς, και να σταµατάει µόνο όταν number=0 (while) 2.Να γραφεί πρόγραµµα που διαβάζει n αριθµούς (το πλήθος n, θα δίνεται µε read) και υπολογίζει το µέσο όρο των ζυγών αριθµών. Προαιρετικά όποιος θέλει υπολογίζει Το πλήθος των αριθµών που δεν ανήκουν στο διάστηµα (-20,20) Το πλήθος των αριθµών που είναι πολλαπλάσια του 5 και ταυτόχρονα δεν ανήκουν στο (- 20,20). [4]
#Aπλό loop ~vassik/bin/loop6 https://linuxcong.org/bash-scripting-tutorial- 12.2. Bash while loop 17.Arithmetic ~vassik/bin/loop6 #! /bin/bash COUNT=6 # bash while loop while [ $COUNT -gt 0 ]; do echo Value of count is: $COUNT let COUNT=COUNT-1 for (( i=0;i<6;i++)); do echo $i do ή COUNT=$((COUNT-1)) ή. http://www.bashguru.com/2010/12/math-inshell-scripts.html You can do maths using any one of the following methods. 1. Using expr command 2 Using $(()) construct. 3 Using let command 4 Using bc command. 5 Using $[] construct. while εντολή do # Επιλογή από µενού https://linuxcong.org/bash-scripting-tutorial - 9.2. Nested if/ ~vassik/bin/nif vassik@aetos:~/bin$./nif 1. Bash 2. Scripting 3. Tutorial Please choose a word [1,2 or 3]? choice=4 while [ $choice -eq 4 ]; do read choice if [ $choice -eq 1 ] ; then echo "You have chosen word: Bash" echo "You have chosen word:other than Bash" [5]