Directories και αρχεία... /bin bin../bin current/ένα πιο πάνω/root bin/current bin/ ένα πιο πάνω και bin mkdir bin rmdir bin (άδειο) cd bin touch f f1 bin/f2 cat >a1 vi a1 vi +10 a1 cp a1 a2 a3 bin cp -r ~vassik/xunix/px/*. rm f1 rm r f? rm i * rm ri * (OPTION -r recursive) home student x0506 chgen gkassos bin bin cat >a1 ena arxeio me onoma a1 dimiourgimeno sta grigora me tin entoli cat CTRL + C / bin mv a1 askisi1 mv a2 bin chmod 755 bin chmod 644 a1 chmod +x a1 Mεταβλητές ~ $HOME $PWD $PATH $LOGNAME $IFS $LANG.. echo "My home dir is $HOME" Wildcards Χαρακτήρες στο shell *? [xyz] [^xy] [!0-9] [:alpha:] [:digit:] ls f*[0-9] λίστα µε ονόµατα από f,0-πολλούς χαρακτήρες µετά και ένα αριθµό, στο currentdir ls dir1/[:alpha:]* λίστα µε ονόµατα, µε 0 έως πολλούς χαρακτήρες [a-za-z], στο dir1 Mερικές εντολές man touch cat le1 le2 which date umask 077 δηλ. 777-700 = 077 αφαιρούνται rwx για g και ο stat f1 wc -l (γραµµές) και c (χαρ/ρες) και w (λέξεις) ps -ef µε πολλές options u, aux, -al, -df.. kill -9 4250 sleep 10 & [1]
Κανονικές Εκφράσεις ^ $. [A-Z] [^0-9] * +? {2,5} {3} \1 Predined Σύνολα Χαρακτήρων [:alnum:] ίδιο µε [0-9a-zA-Z] [:alpha:] ίδιο µε [a-za-z] [:cntrl:] control χαρακτήρας δηλ.<31 στον πίνακα ASCII, [:print:] εκτυπώσιµος χαρακτήρας (visible and spaces). [:digit:] ίδιο µε [0-9] [:xdigit:] ίδιο µε [0-9A-F] [:graph:] εκτυπώσιµος χαρακτήρας εκτός spaces/tabs. [:lower:] πεζός χαρακτήρας [:upper:] κεφαλαίος χαρακτήρας [:punct:] σηµείο στίξης (\]\[!"#$%&'()*+,./:;<=>?@\^_`{ }~-) [:space:] κενό Ο χαρακτήρας \ µπορεί να αναιρέσει την ειδική σηµασία του χαρακτήρα που ακολουθεί Μέσα σε µια κλάση χαρακτήρων σχεδόν όλοι οι ειδικοί χαρακτήρες χάνουν την ειδική σηµασία τους πχ: [{}*()/+*?.] σηµαίνει ένας χαρακτήρας από τους {}*()/+*?. '^$' κενή γραµµή '^.$' γραµµή µε ένα χαρακτήρα [0-9][0-9] οποιοσδήποτε διψήφιος αριθµός [^ ] οποιοσδήποτε χαρακτήρας εκτός από το κενό Μr Miss Mrs εναλλακτικό '^[[:alnum:],+]' ξεκινά µε ένα χαρακτήρα [0-9a-zA-Z,+] '.*' όλες οι γραµµές A{2} και (ΑΒ){2} επανάληψη δηλ. ΑΑ και ΑΒΑΒ (.)\1\1 οποιοσδήποτε χαρακτήρας επαναλαµβάνεται άλλες δυο φορές π.χ. aaa (.)(.)\2\1 οποιοιδήποτε δυο χαρακτήρες επαναλαµβάνονται αντίστροφα πχ abba Yπάρχουν διάφορα set κανονικών εκφράσεων π.χ. ΒRE : βασικές κανονικές εκφράσεις ΕΡΕ: επεκταµένες κανονικές εκφράσεις Στις βασικές κανονικές εκφράσεις δεν ισχύει η ειδική σηµασία των?, +, {,, (, ) παρά µόνο όταν χρησιµοποιούνται µε back slash δηλαδή µε \?, \+, \{, \, \(, \) Εντολή egrep Options -n -v -c -i αριθµός γραµµών/ αντιστροφή λειτουργίας/ πλήθος γραµµών/αγνοεί πεζά-κεφαλαία [2]
Wildcards στο shell και Κανονικές Εκφράσεις RE Τα wildcards ερµηνεύονται από τον φλοιό και ταιριάζουν σε ονόµατα αρχείων. Οι RE ερµηνεύονται από εντολές (πχ: grep) και µπορούν να πραγµατοποιηθούν σύνθετεςλειτουργίες. Στις RΕ για να µην ερµηνευτούν οι ειδικοί χαρακτήρες από τον φλοιό, πρέπει η κανονική έκφραση να περικλείεται σε εισαγωγικά (' ή ", κατά προτίµηση ' µονά) Ανακατευθύνσεις ls -la > le1 date >> le1 write vassik < le1 tr ":" " " < le1 tr a-z A-Z < le1 Pipelines last grep -v '^wtmp' grep -v '^$' cut -f1 -d ' ' sort uniq -c sort -n tail -1 Λάθη stderr (Standard Error) Στην C ένα πρόγραµµα 1 έχει τρεις ροές δεδοµένων που µπορεί να εξετάζονται χωριστά: 0 σηµαίνει STDIN (κανονική είσοδο), που είναι συνήθως το πληκτρολόγιο 1 σηµαίνει STDOUT (κανονική έξοδο), που είναι η οθόνη 2 σηµαίνει STDERR (τυπικό σφάλµα), που είναι συνήθως η οθόνη από προεπιλογή. Ένα πρόγραµµα µε όνοµα x εκτυπώνει στην οθόνη (όταν προεπιλογή εξόδου είναι το stut). x > /dev/null 2>&1 Στην παραπάνω εντολή, το πρώτο µέρος x > /dev/null ανακατευθύνει την έξοδο του x από stut στο /dev/null αρχείο το οποίο είναι κάτι σαν µια «τρύπα χωρίς πυθµένα" στο Linux, ότι πάει εκεί ποτέ δεν έρχεται πίσω. Η κανονική έξοδος θα πάει στο /dev/null αρχείο αλλά η τυπική έξοδος των λαθών (stderr) του x δεν έχει ανακατευθυνθεί και τα µηνύµατα λάθους θα εξακολουθούν να τυπώνονται στην οθόνη. Το τελευταίο µέρος της εντολής 2>&1 (ή και 2>/dev/null) ανακατευθύνει το stderr (2) στο stdin (1), που έχει ήδη ανακατευθυνθεί στο /dev/null. Έτσι, κανένα από αυτά δεν εκτυπώνει στην οθόνη πια. (Πρέπει να προστεθεί το "&" πριν από τον αριθµό 1, διαφορετικά το stderr (2) θα µεταφερθεί σε ένα απλό αρχείο µε όνοµα 1 στον ίδιο κατάλογο, αντί του stut) 1 To Linux χτίστηκε κυρίως µε τη γλώσσα προγραµµατισµού C. [3]
echo "$1" egrep '[^0-9]+' >/dev/null 2>/dev/null και η έξοδος και τα λάθη, στο /dev/null (αυτό είναι χρήσιµο όταν κάνουµε ελέγχους και δεν θέλουµε να εµφανιστεί ΤΙΠΟΤΑ στην οθόνη, αλλά να ελέγξουµε το αποτέλεσµα της εντολής) echo "$1 not a number" 1>&2 η τυπική έξοδος, στην έξοδο των λαθών (αυτό είναι χρήσιµο στα µηνύµατα λαθών γιατί το κανονικό αποτέλεσµα µιας εντολής µπορεί να διασωληνωθεί σε µια άλλη εντολή ή να γραφτεί σε αρχείο ). (ενδεικτικό) κοµµάτι από την άσκηση 9.3 που ελέγχει αν το όρισµα room δεν είναι αριθµός: if echo "$room" egrep '[^0-9]+' >/dev/null 2>/dev/null echo "$room not a number" 1>&2 exit 1 Shell script exit error κωδικοί ορίσµατα µεταβλητές ανάθεση τιµών εκτέλεση εντολές επιτυχής εντολή ΣΗΜΑΙΝΕΙ exit code 0 (echo $?) ανεπιτυχής εντολή ΣΗΜΑΙΝΕΙ exit code οτιδήποτε άλλο εκτός µηδέν. if επιτυχής εντολή echo "Ok" else echo "Not Ok" loop µε την for for i in λίστα ne #! /bin/bash # SXOLIO if test $# -eq 0 echo "Give arguments pls " 1>&2 exit 1 while επιτυχής εντολή echo "loop until stop" ne for i in "$@" ne #σταµάτηµα.. for i in * ne while read a echo "$a" ne < le1 for i in "$1/"* ne *? "$i" " " ' ' ` ` $0 $1 - $9 $* $@ $# $? $$ $! #! # 1>&2 expr $(( )) $[ ] αριθµητικές πράξεις a=3 b=$(($a*4)) c=`expr $a \* 4 ` test -eq -ne -gt -lt =!= -f -d -s [4]
µερικές εντολές: more less head tail wc -l -w c le1µετρά σειρές / λέξεις / χαρακτήρες του αρχείου le1 le πληροφορίες για τα αρχεία που αποτελούν ορίσµατά της. df du tr -s " " < le1 µετατρέπει τα συνεχόµενα κενά, σε ένα κενό uniq -c στην αρχή κάθε γραµµής, ένας αριθµός δηλώνει πόσες φορές εµφανίζεται η ίδια γραµµή uniq -u εµφανίζει µόνον εκείνες τις γραµµές που δεν επαναλαµβάνονται sort -r -n -f le1αντιστροφή λειτουργίας/σορτάρισµα αριθµών/αγνοεί πεζά-κεφαλαία sort -k 2 le1 σορτάρισµα 2 ης στήλης (µε διαχωριστή στήλης το κενό) sort -t ":" αλλαγή διαχωριστή στήλης σε : set read a cut cut -c2,4,6 le1 αποσπά τoυς χαρακτήρες 2,4,και 6 από το le1 cut -c 1-6 le1 αποσπά τoυς πρώτους 6 χαρακτήρες από το le1 cut -f 2-4 le1 αποσπά τις στήλες/πεδία 2 έως 4 (µε διαχωριστή στήλης tab) cut -d: -f2-4 le1 αποσπά τις στήλες/πεδία 2 έως 4 µε διαχωριστή : sed sed 's/ $//g' < le1 οποιοδήποτε κενό χαρακτήρα που υπάρχει στο τέλος κάθε γραµµής sed 's/...//' le1 διαγραφή των 3 πρώτων χαρακτήρων από κάθε γραµµή του αρχείου le1 sed 's/.*$//' le1 εµφανίζει κενές όλες τις γραµµές του αρχείου sed 's/[ ][^ ]*$//g' le1 διαγράφει την τελευταία λέξη κάθε γραµµής echo "John.Smith" sed -r 's/^([^.]*).(.*)$/\2, \1/' δίνει Smith, John option -r sed -e 's/ja/x/' -e 's/sa/x/' le1 για περισσότερα του ενός πρότυπα option -e sed '5d' le1 διαγραφή της 5ης γραµµής sed '/^ *$/d' le1 διαγραφή των κενών γραµµών ή αυτών που περιέχουν µόνον κενά [5]