SCRIPTS FILES ΟΛΑ ΤΑ SCRIPT les πρέπει να είναι ΕΚΤΕΛΕΣΙΜΑ: LAB8 chmod +x myscript $*, $@ : ΟΛΑ - Η λίστα (ο πίνακας) με τα ορίσματα $# πλήθος παραμέτρων Σχόλια AΣΚΗΣΗ 1 - for και παράμετροι εντολής (script με όνομα scr1 ) #scr1 #------------------------------ echo "Arithmos Parameters : $#" for i in $* ; scr2 for i in "$*" ; chmod +x scr1 και τo τρέχουμε με./scr1 "third parameter Arithmos Parameters : 3 third parameter./scr2 "third parameter third parameter $* όλοι οι παραμέτροι θέσης ($1,$2, $n) Όταν χρησιμοποιoύνται διπλά εισαγωγικά, υλοποιείται με μια μόνο λέξη που περιλαμβάνει την τιμή κάθε παραμέτρου, διαχωριζόμενη με διαχωριστικό που αντιστοιχεί στον 1 ο χαρακτήρα του IFS "$1 $2.. $n" scr3 for i in $@ ; scr4 for i in "$@" ; third parameter third parameter $@ ίδιο με $* αλλά όταν χρησιμοποιoύνται διπλά εισαγωγικά κάθε παράμετρος είναι μια ξεχωριστή λέξη "$1" "$2".. "$n" [1]./scr3 "third parameter./scr4 "third parameter
Οι τιμές στην ΛΙΣΤΑ του for μπορούν να είναι νούμερα ή συμβολοσειρές με διαχωριστικό μεταξύ τους το κενό (εκτός και αν οριστεί διαφορετικά στο IFS) for i in ΛΙΣΤΑ π.χ. for i in tasos 3 mary john ΕΝΤΟΛΕΣ Παράδειγμα ενός απλού script με όνομα for1 #! /bin/bash for i in word1 2 test "long arg" 'long 2 arg' i is word1 echo "i is $i" i is 2 i is test i is long arg i is long 2 arg chmod +x for1./for1 ΑΣΚΗΣΗ 2 - Τest στις οντότητες του Λ.Σ. όνομα dirstat #dirstat #Τσεκάρει τι είναι η κάθε οντότητα στο τρέχοντα φάκελο? # Είναι DIRECTORY -d AΡXEIO -f ή κάτι άλλο? (τρέξτε το στο work) #µε * η λίστα του ls -ΠΡΟΣΟΧΗ το * χωρις " " for i in * #... echo "$i is " chmod +x dirstat το τρέχουμε με./dirstat if [ -d "$i" ] ; elif [ -f "$i" ]; Το $i αντιστοιχεί σε ότι έχουµε τρέχον directory π.χ. στο ~vassik/work έστω ότι έχουµε -rwxr-xr-x 2 ktoumpid x1314 351 Apr 18 13:35 monazyga.sh lrwxrwxrwx 1 vassik conit 3 Apr 18 23:12 mylink -> rem lrwxrwxrwx 1 vassik conit 39 Apr 19 00:47 readlink -> /hom -rw-r--r-- 4 vassik conit 422 Apr 19 11:31 readme -rwxr-xr-x 2 vassik conit 527 Apr 19 11:33 whatis drwxr-xr-x 2 vassik conit 4096 Mar 29 21:48 work1 drwxr-xr-x 2 vassik conit 4096 Apr 4 19:18 work2 Για να φτιάξω (soft) link : ln -s rem mylink Και μετά έσβυσα το αρχείο rem monazyga.sh is le mylink is something readlink is le readme is le whatis is le work1 is directory work2 is directory [2] if εντολή_επιτυχής Η επιτυχής εντολή επιστρέφει 0 (η αποτυχία μια τιμή 0 πχ.127 ). echo $? (exit code)
Πως θα ελέγξω τι είναι το καθένα if test -d "$i" ή if [ -d "$i" ] man test if test -f "$i" ή if [ -f "$i" ] SOS ΑΣΚΗΣΗ 3.1 μια παράμετρος /δημιουργία 3 (ή 50) αρχείων - όνομα create_test #create_test 1 Αν δεν δοθεί παράμετρος δηλ. if test $# -eq 0 echo "$0: missing arguments " >&2 exit 1 for ((i=1;i<=3;i++)) #Δημιουργία κενoύ αρχείου με όνομα αν ο αριθμός των παραμέτρων $#=0 θα δείξει μήνυμα και έξοδος (με κωδ.1) vassik@aetos:~$./create_ test./create_ test : missing arguments Αν δοθεί μια παράμετρος, η $1, θα δημιουργηθούν αρχεία με όνομα "$1".$i δηλ. αν δώσω ls -l θα έχω: -rw-r--r-- 1 vassik conit 0 May 4 14:41 kimi.1 -rw-r--r-- 1 vassik conit 0 May 4 14:41 kimi.2 -rw-r--r-- 1 vassik conit 0 May 4 14:41 kimi.3 chmod +x create_test./create_ test kimi H $1 ισούται με kimi #ή και με while: nbles=0 while test $nbles -ne 3 nbles=$(($nbles + 1)) #δημιουργία αρχείου 3.2 creator100, δημιουργεί 100 αρχεία με την ονομασία i le, δηλ. 1le 2le.. 100le times=10 #ας δώσουμε 10 αρχικά.. for (( i=0;i<$times;i++ )) touch "$i"le # ή και ${i}le #γιατί αν δώσω $ile θα ψάχνει μεταβλητή με όνομα ile #να τα δούμε και μετά να τα σβύσουμε ή..φτιάξτε άλλο script που τα σβύνει. 1 Δώστε μια εντολή που απαιτεί ορίσματα, σκέτη χωρίς ορίσματα π.χ. vassik@aetos:~$ cp cp: missing le operand Το μήνυμα λάθους θέλουμε να πάει στην έξοδο λαθών (οθόνη,αρχείο,..) [3]
SOS ΑΣΚΗΣΗ 4 - μια παράμετρος /διαγραφή αρχείου με επιβεβαίωση - όνομα deli #deli Integer comparison if test $# -eq 0 int1 -eq int2 echo "$0: missing arguments " >&2 exit 1 if test! -f "$1" FileSystemCheck -f le echo "$0: not an ordinary le $1.." >&2 exit 2 answer=a while test $answer!= n -o $answer!= y echo -n "Do you want to delete the le $1 (y/n) : " read answer #ελεγχος τι είναι $answer (y ή n : [ $answer = y ] )... chmod +x deli./deli_le1 Do you want to delete le1 (y/n) : y le1 Deleted # Αν δεν είναι κανονικό αρχείο η $1 Logical Operations! (not), -a (and), -o (or) String comparison -z string True if string is empty -n string True if string is not empty string1 ==string2 True if string1 = string2 string1!= string2 True if string1 string2. ΑΣΚΗΣΗ 5 - μια παράμετρος/directory και σπάσιμο σε 2 directories - όνομα dir_split #dir_split # έλεγχος αν έδωσε παράμετρο if [ $# -eq 0 ] ; ; exit 1 ; # έλεγχος αν υπάρχουν ήδη τα ονόματα των 2 καταλόγων με όνομα dir1,dir2 if [ -d "$1"/dir1 -o -d "$1"/dir2 ] ; echo "$0: Directories $1/dir1 or $1/dir2 exist..." >&2 exit 2 #αν δεν υπάρχουν οι φάκελοι dir1 και dir2 # (να ελέγξετε και αν υπάρχουν αρχεία µέσα στον $1) #θα δημιουργεί δύο νέους (κρυφούς) καταλόγους.dir1,.dir2 μέσα στον αρχικό κατάλογο #θα μετακινεί όλα τα αρχεία του καταλόγου στους δύο νέους καταλόγους ως εξής : #στο dir1: τα αρχεία με όνομα που ξεκινά από τα γράμματα A-L (κεφαλαία και μικρά) #στο dir2: τα υπόλοιπα αρχεία #θα εμφανίζει το πλήθος των αρχείων σε καθένα από τους δύο νέους καταλόγους [4] chmod +x dir_split./dir_split Desktop
ΑΣΚΗΣΗ 6 - μια παράμετρος/αρχείο εμφάνιση directory που το περιέχει - όνομα mynd ελέγχει αν το όνομα του αρχείου υπάρχει στον τρέχοντα κατάλογο ή σε κάποιον από τους υποκαταλόγους πρώτου επιπέδου κάτω από τον τρέχοντα κατάλογο και εμφανίζει κάθε κατάλογο στον οποίο υπάρχει αυτό το όνομα αρχείου #mynd chmod +x mynd # έλεγχος αν έδωσε παράμετρο if [ $# -eq 0 ] ; ; exit 1 ;./mynd le1 # έλεγχος αν η $1 είναι κανονικό αρχείο if test -f "$1" echo -n "I found $1 in ";pwd # έλεγχος αν η $1 βρίσκεται σε directory ένα επίπεδο κάτω $i/$1 for i in * if test -d "$i" # έλεγχos αν βρίσκεται το αρχείο μέσα στο $i [5]