Professional Documents
Culture Documents
Lesson 4
Lesson 4
(Μέρος 2ο)
Νικόλαος Παπαδάκης
Αντώνιος Λίτκε
1o Έτος
Εαρινό εξάμηνο
2017-2018
np@sse.gr, alitke@sse.gr
2
Βασικά, Προγραμματισμος Shell
Ένα σενάριο είναι ένα αρχείο που περιέχει
εντολές κελύφους
δομή δεδομένων: μεταβλητές
δομή ελέγχου: ακολουθία, απόφαση, βρόχος
Shebang γραμμή για σενάριο bash shell:
#! /bin/bash
#! /bin/sh
Τρέχουμε με:
●
Δημιουργία script:
Εισαγωγή
Προτροπές προς τον χρήστη
παράμετροι της γραμμής εντολών
Απόφαση
Ifthenelse
case
Επανάληψη
dowhile, repeatuntil
for
select
Συναρτήσεις (functions)
●
Είναι παράμετροι (είσοδοι) που δίδονται στο πρόγραμμα (script)
κατά τη επίκλησησης του (πριν εκτελεστεί), πχ:
●
./myscript 15 no (οι δυο παράμετροι είναι το 15 και το no)
●
/home/auser/folder1/calculator add 44 55 (τρεις παράμετροι σε αυτή την
περίπτωση)
●
Επειδή δεν σίνεται όνομα σε αυτές τις παραμέτρους εισόδου το
bash τις ονομάζει με ένα δικό του τρόπο.
●
Η επίκληση της τιμής κάθε παραμέτρου γίνεται με χρήση του
ειδικού χαρακτήρα “$”
παράμετρος Εννοια
Το κέλυφος μπορεί να ζητά είσοδο από το χρήστη
ονομάζοντας τις παραμέτρους αυτές (αναθέτοντάς
τις σε μεταβλητές που έχει καθορίσει ο
προγραμματιστής)
Σύνταξη (χωρίς εμφάινιση κειμένου και με εμφάνιση):
read varname [περισσότερα VARs]
ή
read -p «προτροπή» varname [περισσότερα VARs]
Οι λέξεις που έχουν εισαχθεί από το χρήστη
ανατίθενται στο varname και VARs
τελευταία μεταβλητή παίρνει υπόλοιπο της γραμμής
εισόδου
ifthenelse
case
loops
– for
– while
– until
– select
if command
then
statements
fi
Οι δηλώσεις εκτελούνται μόνο εάν το “command”
είναι επιτυχές, δηλαδή επιστρέψει “0”
if [ condition ]; then
statements
fi
εκτελεί τις δηλώσεις μόνο αν condition είναι
αληθής
if [ condition ]; then
statements-1
else
statements-2
fi
εκτελεί τις statements1 αν condition είναι
αληθές
εκτελεί τις statements2 αν condition είναι
ψευδές
if [ condition ]; then
statements
elif [ condition ]; then
statement
else
statements
fi
Η λέξη elif σημαίνει «else if»
Είναι μέρος της εντολής if και δεν μπορεί να
χρησιμοποιηθεί από μόνη της
! not
To and, or
&& and πρέπει να περικλείεται εντός
|| or
[[ ]]
#!/bin/bash
#!/bin/bash
Bonus=500
read -p "Enter Status: " Status
read -p "Enter Shift: " Shift
if [[ "$Status" = "H" && "$Shift" = 3 ]]
then
echo "shift $Shift gets \$$Bonus bonus"
else
echo "only hourly workers in"
echo "shift 3 get a bonus"
fi
#!/bin/bash
Σύνταξη:
test expression
[ expression ]
αξιολογεί την «έκφραση» και επιστρέφει true ή
false
Παράδειγμα:
if test –w "$1"
then
echo "file $1 is write-able"
fi
Εννοια
d file Αληθές αν «αρχείο» είναι ένας κατάλογος
f file Αληθές αν «αρχείο» είναι ένα κανονικό αρχείο
r file Αληθές αν «αρχείο» είναι αναγνώσιμο
w file Αληθές αν «αρχείο» είναι εγγράψιμο
x file Αληθές αν «αρχείο» είναι εκτελέσιμο
s file Αληθές αν το μήκος του «φακέλου» είναι μη μηδενικό
#!/bin/bash
echo "Enter a filename: "
read filename
if [ ! –r "$filename" ]
then
echo "File is not read-able"
exit 1
fi
#! /bin/bash
if [ $# -lt 1 ]; then
echo "Usage: filetest filename"
exit 1
fi
if [[ ! -f "$1" || ! -r "$1" || ! -w "$1" ]]
then
echo "File $1 is not accessible"
exit 1
fi
* "TEST" COMMAND
read -p "Do you want to continue?" reply
if test $reply = "y"; then
echo "You entered " $reply
fi
#!/bin/bash
let Net=$Income-$Expense
Χρησιμοποιούμε τη δήλωση περίπτωσης όταν
έχουμε πολλαπλές επιλογές
Σύνταξη:
case word in
pattern1) command-list1
;;
pattern2) command-list2
;;
patternN) command-listN
;;
esac
Mπορεί επίσης να περιέχει:
*
;
[...]
[:class:]
πολλαπλά πρότυπα μπορούν να αναφέρονται
μέσω:
|
#!/bin/bash
echo "Enter Y to see all files including hidden files"
echo "Enter N to see all non-hidden files"
echo "Enter q to quit"
case $reply in
Y|YES) echo "Displaying all (really…) files"
ls -a ;;
N|NO) echo "Display all non-hidden files..."
ls ;;
Q) exit 0 ;;
#!/bin/bash
ChildRate=3
AdultRate=10
SeniorRate=7
read -p "Enter your age: " age
case $age in
[1-9]|[1][0-2]) # child, if age 12 and younger
echo "your rate is" '$'"$ChildRate.00" ;;
# adult, if age is between 13 and 59 inclusive
[1][3-9]|[2-5][0-9])
echo "your rate is" '$'"$AdultRate.00" ;;
[6-9][0-9]) # senior, if age is 60+
echo "your rate is" '$'"$SeniorRate.00" ;;
esac
Σκοπός:
Για να εκτελέσετε δέσμη εντολών για όσο
διάστημα η “έκφραση (expression) ” είναι
αληθής
Σύνταξη:
while [ expression ]
do
command-list
done
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]
do
echo “The counter is” $COUNTER
let COUNTER=$COUNTER+1
done
#!/bin/bash
count=1;
while read F; do
echo $count $F
let count+=1
done < ./world_countries.csv
#!/bin/bash
Cont="Y"
while [ $Cont = "Y" ]; do
ps -A
read -p "want to continue? (Y/N)" reply
Cont=`echo $reply | tr [:lower:] [:upper:]`
done
echo "done"
#!/bin/bash
# copies files from home- into the webserver- directory
# A new directory is created every hour
PICSDIR=/home/carol/pics
WEBDIR=/var/www/carol/webcam
while true; do
DATE=`date +%Y%m%d`
HOUR=`date +%H`
mkdir $WEBDIR/"$DATE"
while [ $HOUR -ne "00" ]; do
DESTDIR=$WEBDIR/"$DATE"/"$HOUR"
mkdir "$DESTDIR"
mv $PICSDIR/*.jpg "$DESTDIR"/
sleep 3600
HOUR=`date +%H`
done
done
Σκοπός:
Για να εκτελέσετε εντολές για όσο διάστημα το
«expression» είναι ψευδές
Σύνταξη:
until [ expression ]
do
command-list
done
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]
do
echo $COUNTER
let COUNTER-=1
done
#!/bin/bash
Stop="N"
until [ $Stop = "Y" ]; do
ps -A
read -p "want to stop? (Y/N)" reply
Stop=`echo $reply | tr [:lower:] [:upper:]`
done
echo "done"
Σκοπός:
Nα εκτελέσει εντολές συγκεκριμένο αριθμό
φορών
Σύνταξη:
for variable in argument-list
do
commands
done
#!/bin/bash
for i in 7 9 2 3 4 5
do
echo $i
done
#!/bin/bash
# Υπολογίζει τη μέση εβδομαδιαία
θερμοκρασία
for num in 1 2 3 4 5 6 7
do
read -p "Enter temp for day $num: " Temp
let TempTotal=$TempTotal+$Temp
done
let AvgTemp=$TempTotal/7
echo "Average temperature: " $AvgTemp
#!/bin/bash
# download numbered pages from a site
done
απλούστερη μορφή θα επαναλάβει πάνω από
όλα τις εντολές της γραμμής εντολών:
#! /bin/bash
for parm
do
echo $parm
done
Δημιουργεί απλό μενού από τη λίστα λέξεων
Επιτρέπει στο χρήστη να εισάγει έναν αριθμό
αντί για μια λέξη
Ο χρήστης εισάγει τον αριθμό ακολουθίας που
αντιστοιχεί στη λέξη
Σύνταξη:
select WORD in LIST
do
RESPECTIVE-COMMANDS
done
Ισχύει έως τέλος εισαγωγής, δηλαδή ^d (ή ^c)
#! /bin/bash
select var in alpha beta gamma
do
echo $var 1) alpha
done 2) beta
3) gamma
Εκτυπώνει:
#; 2
beta
#; 4
#; 1
alpha
PS3 επιλογή υπογραμμής
$REPLY η απάντηση που εισάγει ο χρήστης (ο
αριθμός) Output:
select ...
#! /bin/bash 1) alpha
PS3="select entry or ^D: " 2) beta
? 2
select var in alpha beta
2 = beta
do ? 1
echo "$REPLY = $var" 1 = alpha
done
Διακόπτης για, while ή until βρόχο
Η εντολή break
μεταφέρει τον έλεγχο στην δήλωση μετά τη δήλωση
done
τερματίσει εκτέλεση του βρόχου
Η δήλωση continue
μεταφέρει τον έλεγχο στην δήλωση TO
συνεχίζει την εκτέλεση του βρόχου
while [ condition ]
do
cmd-1
break Αυτή η επανάληψη
cmd-n έχει ολοκληρωθεί
δεν θα υπάρξουν
done
άλλες επαναλήψεις
echo "done"
while [ condition ]
do
cmd-1 Αυτή η επανάληψη
continue έχει ολοκληρωθεί.
cmd-n Προχώρα με την
done επόμενη επανάληψη
echo "done"
for index in 1 2 3 4 5 6 7 8 9 10
do
if [ $index –le 3 ]; then
echo "continue"
continue
fi
echo $index
if [ $index –ge 8 ]; then
echo "break"
break
fi
done
Μια συνάρτηση κέλυφος είναι παρόμοια με ένα
σενάριο φλοιού
αποθηκεύει μια σειρά από εντολές για μετέπειτα
εκτέλεση
Το κέλυφος αποθηκεύει τις functions στη μνήμη
φλοιός εκτελεί μια function στο ίδιο κέλυφος που
την κάλεσε
Που μπορούμε να τις καθορίσουμε
Σε .profile
Σε ένα σενάριό σας
Ή στη γραμμή εντολών
Η function πρέπει να οριστεί πριν να αναφερθεί
συνήθως τοποθετούνται στην αρχή του
\
σεναρίου
Σύνταξη:
function-name () {
statements
}
#!/bin/bash
funky () {
# This is a simple function
echo "This is a funky function."
echo "Now exiting funky function."
}
funky
#!/bin/bash
fun () { # Μια κάπως πιο σύνθετη λειτουργία.
JUST_A_SECOND=1
let i=0
REPEATS=30
echo "Και τώρα η διασκέδαση αρχίζει
πραγματικά."
while [ $i -lt $REPEATS ]
do
echo "-------FUNCTIONS are fun-------->"
sleep $JUST_A_SECOND
let i+=1
done
}
fun
Δεν χρειάζεται να δηλώνονται
Παράμετροι που παρέχονται μέσω κλήσης
συνάρτησης είναι προσβάσιμα διαμέσου $1, $2,
$3, ...
$# επιστρέφει τον αριθμό των παραμέτρων
$0 περιέχει το όνομα του σεναρίου
(Όχι το όνομα της συνάρτησης)
#! /bin/sh
testfile() {
if [ $# -gt 0 ]; then
if [[ -f $1 && -r $1 ]]; then
echo $1 is a readable file
else
echo $1 is not a readable file
fi
fi
}
testfile .
testfile funtest
#! /bin/bash
checkfile() {
for file
do
if [ -f "$file" ]; then
echo "$file is a file"
else
if [ -d "$file" ]; then
echo "$file is a directory"
fi
fi
done
}
checkfile . funtest
Οι μεταβλητές που ορίζονται μέσα στη function
είναι καθολικές,
δηλαδή οι τιμές τους είναι γνωστές σε όλο το
πρόγραμμα στο κέλυφος
λέξηκλειδί «local» μέσα σε ένα ορισμό
συνάρτησης κάνει τη μεταβλητή «τοπική» σε
αυτή την function
#! /bin/bash
foo () {
local inside="not so good variable"
echo $global
echo $inside
global="better variable"
}
echo $global
foo
echo $global
echo $inside
Unix επιτρέπει να στείλετε μηνύματα σε κάθε
διαδικασία
κατάλογο των διαδικασιών σας με
ps -u userid
% kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
To ^c είναι 2 SIGINT
●
Pdftk
●
Dot
●
Convert