Τελευταίες σημειώσεις - 2016 Μεταβλητές Βάζουμε μεταβλητές πχ για πιο ευκρινές πρόγραμμα (προτιμήστε μικρά γράμματα και όχι ονόματα εντολών) πχ. filename="$1" (αποφύγετε το file="$1" υπάρχει εντολή file και το FILENAME="$1" ) Μην αφήνετε κενά πριν και μετά το = 1) a=date echo $a date 2) a=`date` echo $a Tue May 24 09:31:41 EEST 2016 3) set $a echo $1 $2 $4 Tue May 09:31:41 H ανάκτηση της τιμής μιας μεταβλητής γίνεται με $ π.χ. echo "$PWD $a" και την εσωκλείω σχεδόν πάντα σε "" π.χ. "$1" εκτός αν είναι αριθμός π.χ. n=3; echo $n ή αν θελω να την σπάσω με την set π.χ. set $a κτλ. Πράξεις με μεταβλητές αριθμούς (με πολλούς τρόπους..) π.χ. n=3; echo $[n+5] 8 Εντολή wc -l Mπορώ να μετρήσω πόσες γραμμές έχει ένα αρχείο π.χ. το file1 : vassik@aetos:~/work$ cat file1 wc -l 10 ή να μετρήσω πόσες γραμμές δίνει μια οποιαδήποτε άλλη εντολή π.χ. η finger : vassik@aetos:~/work$ finger wc -l 8 Ο διαχωριστής μεταβλητών ορίζεται στο IFS ( \t\n) Aν θέλω στο σκριπτάκι τον αλλάζω π.χ.: d="09:31:41" ; IFS=":" ; set $d echo $2 31 και μπορώ να βάλω το αποτέλεσμα σε μεταβλητή ώστε να κάνω πράξεις ή έλεγχο : ή vassik@aetos:~/work$ wc -l <file1 10 vassik@aetos:~/work$ lines=`finger wc -l ` ή vassik@aetos:~/ work$ echo $[lines -1] 7 if [ $lines -lt 11 ] ; then echo "There are.. " fi Εντολή tr a-z A-Z Mπορώ να γράψω με κεφαλαία ένα αρχείο π.χ. το file1 : vassik@aetos:~/work$ cat file1 tr [:lower:] [:upper:] HTTP://WWW.IT.TEITHE.GR/KERVEROS/~DIPLOMAT/INDEX.HTML HTTP://WWW.DEITEL.COM/~BOOKS.CGI/OS3E/ HTTP://WWW.PARINUX.ORG/PIPERMAIL/LINUX/2001JUNE/016876.HTML Ή vassik@aetos:~/work$ tr a-z A-Z<file1 HTTP://WWW.IT.TEITHE.GR/KERVEROS/~DIPLOMAT/INDEX.HTML HTTP://WWW.DEITEL.COM/~BOOKS.CGI/OS3E/ HTTP://WWW.PARINUX.ORG/PIPERMAIL/LINUX/2001JUNE/016876
ή να γράψω με κεφαλαία το αποτέλεσμα μιας οποιαδήποτε άλλης εντολή π.χ. της ls : vassik@aetos:~/work$ ls -lt tr a-z A-Z TOTAL 2064 DRWXRWXRWX 9 VASSIK CONIT 4096 MAY 2321:49 ONLINE DRWXR-XR-X 2 VASSIK CONIT 4096 MAY 2321:41 WORK10 -RWXR-XR-X 2 VASSIK CONIT 1268 MAY 2320:42 CHECK.SH και tr -s " " για να μετατρέψω τα πολλαπλά κενά, που δίνει μια εντολή σε ένα κενό, π.χ. η ps : vassik@aetos:~/work$ ps -ef tr -s ' ' root 5526 1860 0 09:11? 00:00:00 sleep 60 iliou 5538 6427 76 09:11? 00:00:00 [php-cgi] <defunct> vassik 5541 25416 0 09:11 pts/1 00:00:00 ps -ef Αυτό κυρίως σε συνδυασμό με το cut (για μια στήλη ή για την τελευταία) vassik@aetos:~/work$ ps -ef tr -s ' ' cut -d" " -f 8- /sbin/klogd -x /usr/sbin/inetd pop3-login /usr/sbin/apache2 -k start Ζητώ την 8 η και στήλη και μετά με 8- για να πάρω την στήλη με την εντολή Εντολή cut -f8 Εμφανίζω ένα ή περισσότερα πεδία (-field) Μπορώ να αλλάξω τον διαχωριστή των πεδίων (-delimeter) ls -l tr -s ' ' cut -d ' ' -f8 21:49 11:30 10:06 ls -l tr -s ' ' cut -d ' ' -f8 cut -d':' -f1 21 11 10 Aφού βγάλω τα πολλά κενά από την ls ζητώ (-f8) την 8 η στήλη, με την ώρα και με διαχωριστή (-d" ") το κενό. Mετά ξαναλλάζω διαχωριστή και βάζω -d':' για να πάρω την 1 η στήλη-ώρα (hh) ** Ότι δεν θέλουμε (επικεφαλίδες εντολών) το αφαιρούμε, π.χ. την 1 η γραμμή της ls -l ( total 2068 ) ls -l egrep -v '^total' Eντολή sort -k5 Ταξινόμηση αλφαβητική Μπορώ να αλλάξω το κλειδί (-key) της ταξινόμησης καθώς και τον διαχωριστή των πεδίων (-t) cat /etc/passwd sort -t":" -k5 konadam:x:1319:1044:adamidis Konstantinos:/home/student/x0405/konadam:/bin/bash adamidis:x:1337:1000:adamidis Panagiotis:/home/staff/it/adamidis:/bin/bash chagapid:x:1531:1066:agapidis Charalampos:/home/student/x1516/chagapid:/bin10:06
Eντολή uniq -c Για να βρώ και να μετρήσω πόσες φορές επαναλαμβάνεται ένα αλφαριθμητικό Προηγείται το sort ps aux egrep -v '^USER' cut -d' ' -f1 sort uniq -c 4 vlainidi 10 www-data 1 zbourtzo Eντολή sed Για να βρώ και να μετρήσω ποιο αλφαριθμητικό εμφανίζεται περισσότερες φορές Προηγείται και έπεται το sort ps aux egrep -v '^USER' cut -d' ' -f1 sort uniq -c sort -n tail -1 211 root Eντολή sed -r Για να μην εμφανίσω μια γραμμή (ή περισ/ρες ) ps sed '1d' 1607 pts/1 00:00:00 ps 1608 pts/1 00:00:00 sed 25416 pts/1 00:00:01 bash Για να μην εμφανίσω μια στήλη (ή περισ/ρες ) - αντικατάσταση στήλης με κενό ps sed 1d sed -r 's/^[^:]+:..:.. //' ps sed sed bash sed -r 's/pattern/αντικατάσταση/' μπορείτε να δοκιμάζετε πρώτα το pattern με egrep --color π.χ. Για να εμφανίσω μια στήλη πολλές φορές - με buffers \1 \1 \1 ps sed 1d sed -r 's/^([ 0-9]+ )/\1 \1 \1/' Για εναλλαγή στηλών με buffers \1 \2 κτλ. ps sed 1d sed r 's/^([^:]+:)(..):(..) /\1\3:\2 /' 1 2 3 Kαλή Επιτυχία.
Τελευταίες σημειώσεις - Παλαιοτέρων ετών test [ ] #! /bin/bash # SXOLIO if test $# -eq 0 then echo "Give arguments pls " 1>&2 exit 1 fi ΙΔΙΑ #! /bin/bash # SXOLIO if [ $# -eq 0 ] then echo "Give arguments pls " 1>&2 exit 1 fi Αν το πλήθος των ορισμάτων ισούται με 0 Μήνυμα στη έξοδο λαθών 1>&2 Εξοδος από το πρόγραμμα Αν το πλήθος των ορισμάτων ΔΕΝ ισούται με 6 if [ $# -ne 6 ] test ή [ ] Αν το πλήθος των ορισμάτων > 3 : if [ $# -gt 3 ] -eq -ne -gt -lt Αν το 1 ο όρισμα δεν είναι αρχείο : if [! -f "$1" ] -f -d -s Αν το 3 ο όρισμα δεν είναι φάκελος: if [! -d "$3" ] =!= Συνδυαστικοί έλεγχοι με -a(and) και -ο(οr)(κενά πριν και μετά) while test $a!= y -a $a!= n ελέγχει αν η μεταβλητή a δεν είναι y,n. αριθμοί αρχεία strings ΜΕ KENA π.χ. [ $# -eq 0 ] κενό πριν/μετά από τα : [ ] -eq Προσοχή στα ΚΕΝΑ, μπαίνουν ΠΡΙΝ και ΜΕΤΑ από κάθε ΤΕΛΕΣΤΗ. Προσοχή το!= είναι ο τελεστής ανισότητας δυο strings [ $a!= $b ] O τελεστής ανισότητας! ΔΕΝ πρέπει να κολλάει [! -f "$1" ] Aυτός είναι τελεστής δεν χωρίζουμε το! από το = ΧΩΡΙΣ ΚΕΝΟ Στην ανάθεση τιμής σε μεταβλητή δεν μπαίνει κενό ΠΡΙΝ ΚΑΙ ΜΕΤΑ ΤΟ ΙΣΟΝ = π.χ. αριθμητικές πράξεις a=3 b=$(($a+1)) ή b=$((a+1)) ή b=`expr $a + 1 ` ή b=$[$a+1] ΜΗΝΥΜΑΤΑ Τα μηνύματά σας να είναι τα κατάλληλα πάρτε παράδειγμα από τις ίδιες τις εντολές unix Αν πχ. δώστε την εντολή copy χωρίς ορίσματα, ή με ένα όρισμα μόνο : vassik@aetos:~ $ cp cp: missing file operand vassik@aetos:~ $ cp filea Try `cp --help' for more information. cp: missing destination file operand after `filea' Try `cp --help' for more information.
Τα ανάποδα εισαγωγικά ` ` προκαλούν εκτέλεση εντολής χωρίς όμως εμφάνιση στην οθόνη (κανονικό output) d=`date` ; με echo "$d" Wed Jun 1216:53:24 EEST 2013 εμφανίζει την ημερομηνία Η μεταβλητή d έχει το αποτέλεσμα της εντολής lines=`cat myfile wc -l` Η μεταβλητή lines ισούται με το πλήθος των γραμμών του αρχείου myfile echo "$lines" (προσοχή πάντα την μεταβλητή μέσα σε " ") Τo /dev/null entoli 1>/dev/null 2>&1 Στην παραπάνω εντολή, το πρώτο μέρος entoli 1>/dev/null ανακατευθύνει την έξοδο της εντολής από το stut στο /dev/null αρχείο το οποίο είναι κάτι σαν μια «τρύπα χωρίς πυθμένα" στο Linux, ότι πάει εκεί ποτέ δεν έρχεται πίσω. Αυτό είναι χρήσιμο όταν θέλω να ελέγξω κάτι π.χ. if test entoli αλλά δεν θέλω να δω το αποτέλεσμά του μόνο να το κρίνω. Το >& δηλώνει ανακατεύθυνση ενός stream σε άλλο stream µε fd 0:stdin, 1:stut 2:stderr if echo "$a" egrep '[^0-9]' 1>/dev/null 2>/dev/null ελέγχει αν η μεταβλητή a έχει ένα χαρακτήρα που δεν είναι ψηφίο (δηλ. αν η a δεν είναι αριθμός ) π.χ. αν η μεταβλητή a είναι π.χ. 3ma4, τότε το 3ma45 θα τυπωθεί και αυτό δεν το θέλουμε. Τo $? Αν η εντολή επιτύχει το "exit status" της $? είναι 0 αλλιώς είναι διάφορο του 0. vassik@aetos:~$ echo "MHNYMA" MHNYMA vassik@aetos:~$ echo $? 0 vassik@aetos:~$ echooooo "MHNYMA" -bash: echooοοο: command not found vassik@aetos:~$ echo $? 127 Το "exit status" της τελευταίας εντολής που εκτελέστηκε (μεταβλητή μιας χρήσης) Μια σωστή εντολή (π.χ. echo MHNYMA ) επιστρέφει μηδέν Στο πρόγραμμά μας για τα λάθη λέμε exit 1 exit 2 κτλ. Το exit 0 σημαίνει εκτελέστηκε σωστά (αλλά και το echo.. επιστρέφει μηδέν) Όταν τo exit χρησιμοποιείται xωρίς νούμερο επιστρέφεται το exit code της εντολής ($?) που εκτελέστηκε τελευταία. for Το i παίρνει τιμές από for i in "$@" echo "$i" ne την λίστα των oρισμάτων που δίνονται με την εντολή (shell script) for i in * echo "$i" ne Οι μεταβλητές που χρησιμοποιούμε να είναι σε διπλά " π.χ. echo "$i" οντότητες (αρχεία, directories,..) που βρίσκονται στο τρέχοντα φάκελο for i in "$1"/* echo "$i" ne οντότητες στο φάκελο που αντιπροσωπεύει η $1
while i=10 while [ $i -ne 0 ] i=`expr $i - 1` ne Το loop επαναλαμβάνεται μέχρι η μεταβλητή i να γίνει 0. Aνακατεύθυνση εντολής >, >>, <, << vassik@aetos:~$ head -4 "$1" > newfile vassik@aetos:~$ ls -la >> newfile while read line echo "$line" ne < "$1" > overwrite >> append Ανάγνωση του αρχείου $1 και εμφάνιση κάθε γραμμής του set Η εντολή set αν δοθεί με όρισμα μια μεταβλητή, «σπάει» την μεταβλητή σε πεδία π.χ. vassik@aetos:~$ a="h SET THA TO KANEI 7 PEDIA" vassik@aetos:~$ set $a vassik@aetos:~$ echo $1 $2 $3 $4 $5 H SET THA TO KANEI Προσοχή: Αν απαιτείται σε ένα πρόγραμμα να χρησιμοποιήσετε έτσι την set, Να μην χάσετε τις μεταβλητές του προγράμματος ne <"$filename" Η μεταβλητή IFS (Internal Field Separator) περιέχει τους διαχωριστές των λέξεων π.χ. το κενό, το tab κτλ. O διαχωριστής μπορεί να αλλάξει στο κέλυφος π.χ. αν θέλαμε να ήταν το : θα γράφαμε IFS=":" cut Η εντολή cut εμφανίζει κάθετα κομμάτια από ένα αρχείο (με διαχωριστή στηλών το tab). cut -d ":" -f 5 /etc/passwd έτσι αλλάζω διαχωριστή : και παίρνω το 5 ο πεδίο του αρχείου (ονοματεπώνυμο). Όταν οι στήλες χωρίζονται με πολλά κενά, μπορούν να αφαιρεθούν με tr π.χ. ls -l tr -s " " cut -d " " -f 9 έτσι αλλάζω διαχωριστή σε κενό και παίρνω το 9 ο πεδίο του αρχείου (όνομα αρχείου/φακέλου). uniq uniq -c uniq -u sort στην αρχή κάθε γραμμής, ένας αριθμός δηλώνει πόσες φορές εμφανίζεται η ίδια γραμμή εμφανίζει μόνον εκείνες τις γραμμές που δεν επαναλαμβάνονται sort -r -n -f file1αντιστροφή λειτουργίας/σορτάρισμα αριθμών/αγνοεί πεζά-κεφαλαία sort -k 2 file1 σορτάρισμα 2 ης στήλης (με διαχωριστή στήλης το κενό) sort -t ":" αλλαγή διαχωριστή στήλης σε : tr tr -s " " < file1 μετατρέπει τα συνεχόμενα κενά, σε ένα κενό tr ":" " "< file1 μετατρέπει τo :, σε ένα κενό διαχωριστής των λέξεων είναι το κενό filename="$1" while read line set $line echo $1 $3 $2