Δομές προγραμματισμού του φλοιού

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Σύνθεση εντολών

Ο φλοιός δέχεται:
Απλές εντολές
Εκχώρηση σε μεταβλητή ή εντολή με παραμέτρους, και αλλαγή εισόδου εξόδου τερματισμένη με τον τελεστή ελέγχου &.

Παράδειγμα:

NAME=john
ls -rtl
cat foo bar >foobar
calc_pi &
Σωληνώσεις απλών εντολών
Εντολή (προαιρετικά με ! στην αρχή της) προαιρετικά σωληνωμένη με άλλες εντολές.

Παράδειγμα:

ls -l | more
! grep check file
Λίστες σωληνώσεων
Σωληνώσεις χωρισμένες με:
||
διάζευξη (η δεύτερη εντολή εκτελείται μόνο αν η πρώτη τερματίσει με αποτυχία)
&&
σύζευξη (η δεύτερη εντολή εκτελείται μόνο αν η πρώτη τερματίσει με επιτυχία)
;
παράθεση (η δεύτερη εντολή εκτελείται πάντα μετά την πρώτη)

Παράδειγμα:

mail john <foo && rm foo
cat foo >bar || echo "Unable to read foo"
ls /tmp ; ls /dev
Λίστες σωληνώσεων ομαδοποιημένες σε ( ) ή σε { ; }
Οι παρενθέσεις δηλώνουν εκτέλεση σε υποφλοιό (όλες οι μεταβλητές που ορίζονται στον υποφλοιό δε μεταφέρονται στον τρέχοντα φλοιό), ενώ οι αγκύλες δηλώνουν απλά ομαδοποιημένη εκτέλεση.

Εντολές ελέγχου

Ο φλοιός δέχεται ακόμα τις παρακάτω δομές ελέγχου:
for name [ in word; ] do list ; done
Εκτέλεση των εντολών της list για όλες τις λέξεις θέτοντας κάθε φορά τη μεταβλητή name στην ανάλογη τιμή.

Παράδειγμα:

for fname in *.c
do
	ls -l $fname
	cat $fname
done
case word in [ pattern [ | pattern ] ... ) list ;; ] ... esac
Εκτέλεση των εντολών της list για κάθε word που ταιριάζει με το αντίστοιχο pattern.

Παράδειγμα:

case $fname in
	*.c|*.for)	echo Source file ; cat *.c ;;
	*.o)		echo Object file ;;
	*)		echo Other file ;;
esac
if list_c1 then list_r1 [ elif list_c2 then list_r2 ] ... [ else list_r3 ] fi
Εκτέλεση των εντολών της list_r1 αν η εντολή list_c1 είναι αληθής, αλλιώς εκτέλεση της εντολής list_r2 αν η εντολή list_c2 είναι αληθής ... αλλιώς εκτέλεση της εντολής list_r3.

Παράδειγμα:

if grep John /etc/passwd
then
	echo John is a valid user
else
	echo No user named John was found
fi
while list1 do list2 done
Εκτέλεση των εντολών της list2 όσο είναι επιτυχής η εκτέλεση της εντολής list1

Παράδειγμα:

while ! {finger | grep John ; }
do
	sleep 10
done
echo John  left

Λεκτικά στοιχεία

Μεταβλητές

Οι παρακάτω μεταβλητές έχουν ειδικό νόημα στον φλοιό
$?
Το αποτέλεσμα της προηγούμενης εντολής (αληθές / ψευδές).
$1
Η πρώτη παράμετρος της εντολής
$2
Η δεύτερη παράμετρος της εντολής
Η παράμετρος ν της εντολής
$*
Όλες οι παράμετροι της εντολής

Άσκηση

  1. Υλοποιήστε τη δική σας εντολή, myrm, η οποία για κάθε παράμετρο που της δίδεται για να διαγράψει σας ρωτάει αν θέλετε να διαγράψετε το συγκεκριμένο αρχείο ή όχι.

    Παράδειγμα:

    myrm *.c
    Delete prog1.c (y/n)?
    y
    prog1.c deleted
    Delete prog2.c (y/n)?
    n
    Did not delete prog2.c
    

Βιβλιογραφία