bash_variables

=Μεταβλητές, ειδικοί χαρακτήρες ...κι άλλα περίεργα=

Στο προηγούμενο μέρος είδαμε πως μπορούμε να δημιουργήσουμε ένα "απλό" bash script αρχείο το οποίο το μόνο που κάνει είναι να εκτελεί μια σειρά από εντολές. Βασικά η έκφραση "το μόνο που κάνει" χρησιμοποιείται λίγο καταχρηστικά γιατί όλα τα bash scripts ΜΟΝΟ ΑΥΤΟ ΚΑΝΟΥΝ !! Η διαφορά βρίσκεται στο ΠΩΣ κάνουν αυτή την εργασία. Εφόσον είστε σίγουροι ότι έχετε κατανοήσει πλήρως τα γραφόμενα στο πρώτο μέρος, τότε είσαστε έτοιμοι να προxωρήσετε στα κατωτέρω. Μη βιαστείτε. Το "πρώτο μου scriptάκι", αν και μικρό σε μέγεθος κρύβει μέσα του σημαντικές αρχές που πρέπει να κατανοηθούν και να υιοθετηθούν σε κάθε script που φτιάχνετε, όσο απλό ή πολύπλοκο κι αν είναι αυτό.


 * Μεταβλητές (Variables)**

Τα script (αλλά και όλα τα προγράμματα γενικότερα) χρειάζονται έναν τρόπο να αποθηκεύουν τα δεδομένα που χρησιμοποιούν. Οι μεταβλητές προσφέρουν τρόπους, ώστε να επεξεργαζόμαστε ή/και ν' απεικονίζουμε αυτά τα δεδομένα.

__Ορισμός__ : Μια μεταβλητή είναι μια θέση στη μνήμη του ΗΥ στην οποία μπορούμε ν' αποθηκεύσουμε μια τιμή. Το όνομα της μεταβλητής είναι μια ετικέτα χάρη στην οποία μπορούμε να αναφερθούμε εύκολα στην τιμή που αποθηκεύσαμε χωρίς να ξέρουμε την διεύθυνσή της στη μνήμη.

Ας γίνουμε ποιο κατανοητοί: Με την παρακάτω γραμμή

code format="text" MYVAR=3 code

δίνουμε την τιμή 3 σε μια διεύθυνση της μνήμης (η οποία δε μας ενδιαφέρει) με την ετικέτα "MYVAR".

Αν τώρα θέλουμε να αναφερθούμε στην τιμή της μεταβλητής "MYVAR" πρέπει να προσθέσουμε το σήμα του δολαρίου (μην το μπερδέψετε με το αντίστοιχο που ξεχωρίζει τον απλό χρήστη απ' τον super user) στην αρχή του ονόματός της. πχ για τυπώσουμε στην οθόνη αυτή την τιμή, αρκεί να γράψουμε την γραμμή:

code format="text" echo $MYVAR code

Οι μεταβλητές μπορούν να πάρουν τους παρακάτω **τύπους** τιμών: α. String (Δηλαδή μια σειρά από αλφαριθμητικούς χαρακτήρες) β. Ακέραιους αριθμούς γ. Σταθερές τιμές που δεν μεταβάλλονται (string ή ακέραιοι) δ. Arrays (αυτό είναι στην ουσία μια σειρά μεταβλητών με το ίδιο όνομα πχ MYVAR[1], MYVAR[2], MYVAR[3]...) Σημείωση: Στην πραγματικότητα οι μεταβλητές του bash παίρνουν μόνο τιμές αλφαριθμητικών χαρακτήρων (strings). Απλά όταν αυτοί είναι μόνο χαρακτήρες που αντιπροσωπεύουν νούμερα, τότε μπορούν να γίνουν και αριθμητικές πράξεις ή συγκρίσεις μεταξύ τους.

Στο παράδειγμα του πρώτου μέρους (hello.sh) θα μπορούσαμε να χρησιμοποιήσουμε μια μεταβλητή η οποία θα περιέχει το μήνυμα μας. Έτσι αν χρειαζότανε να το τυπώσουμε πολλές φορές στην οθόνη, δεν είναι απαραίτητο να το ξαναγράφουμε ολόκληρο. Αρκεί η χρήση του ονόματος της μεταβλητής:

code format="text"
 * 1) ! /bin/bash


 * 1) filename		: hello.sh
 * 2) Date of creation	: 15 July 2008
 * 3) Date of last modification	: 15 August 2008
 * 4) Creator			: luckyb
 * 5) modified by		: luckyb on 15 August 2008


 * 1) This is my first script modified
 * 2) It clears the screen end outputs the sentence "Hello luckyb" on the screen using a variable

clear
 * 1) clear the screen

MyMessage="Hello luckyb"
 * 1) Define the variable which contains my message

echo $MyMessage echo echo "I forgot to mention:" echo "$MyMessage ...again :-)" code
 * 1) Output the message
 * 1) Output the message again

Εδώ η μεταβλητή "MyMessage" περιέχει τιμή τύπου string (αλφαριθμητικούς χαρακτήρες). Ακολουθεί ένα παράδειγμα χρήσης μεταβλητής με τιμή ακέραιου αριθμού:

code format="text"
 * 1) ! /bin/bash

MyInt=2		#MtInt is assigned the integer value of 2 echo "The variable MyInt has an integer value of $MyInt"

let "MyInt +=3"	#Add 3 to the current value of MyInt echo "The variable MyInt is now $MyInt" code

Το όνομα μιας μεταβλητής είναι "case sensitive", δηλαδή έχει σημασία αν γράφουμε με μικρά ή με κεφαλαία γράμματα. Έτσι η μεταβλητή "myMessage" είναι διαφορετική από την "MyMessage"

Επίσης υπάρχουν κάποια ονόματα μεταβλητών τα οποία τα χρησιμοποιεί το ίδιο το BASH, σημαίνουν κάτι γι' αυτό και δεν επιτρέπεται η χρήση από εμάς. Ακολουθούν μερικά παραδείγματα: PATH PS1 LANG OS SHELL Μπορείτε να δείτε τα περιεχόμενά τους με την εντολή πχ

code format="text" echo $SHELL code


 * Συστοιχίες μεταβλητών - arrays**

__Ορισμός__ : Μια συστοιχία (array) είναι μια μεταβλητή η οποία περιέχει πολλαπλές τιμές.

Δεν υπάρχει μέγιστο όριο στο μέγεθος μιας συστοιχίας, ούτε κάποιος περιορισμός ότι η αρίθμηση των μελών μιας συστοιχίας πρέπει να είναι συνεχής.

Ο oρισμός μιας συστοιχίας γίνεται με τις εντολές: ARRAY[INDEX]=value ή ARRAY=(value1 value2 value3 ... valueN)

...και σε παράδειγμα:

code format="text"


 * 1) ! /bin/bash

DaysOfWeek=(Monday Tuesday Wednesday Thursday Friday) echo ${DaysOfWeek[*]} echo ${DaysOfWeek[0]} echo ${DaysOfWeek[4]}

DaysOfWeek[5]="Saturday" DaysOfWeek[12]="Sunday" echo ${DaysOfWeek[*]} code

Εξήγηση : Αρχικά δηλώνουμε το array "DaysOfWeek" με 5 μέλη. Κάθε μέλος περιέχει το όνομα μιας ημέρας. Μετά τυπώνουμε στην οθόνη κατά σειρά: Όλα τα μέλη του array με την εντολή echo

code format="text" ${DaysOfWeek[*]} code Μόνο το μέλος με INDEX=0 (το πρώτο δηλαδή) με την εντολή "echo ${DaysOfWeek[0]}" Μόνο το μέλος με INDEX=4 (το πέμπτο δηλαδή) με την εντολή "echo ${DaysOfWeek[0]}"

Έπειτα προσθέτουμε δυο ακόμα μέλη στο array μας. Το έκτο μέλος με INDEX=5 και τιμή "Saturday" Το έβδομο μέλος με INDEX=12 και τιμή "Sunday" Τέλος τυπώνουμε όλα τα μέλη του ανανεωμένου πια array.


 * Αριθμητικοί τελεστές**

Οι αριθμητικοί τελεστές δεν είναι τίποτ' άλλο από τα γνωστά σύμβολα αριθμητικών πράξεων:


 * +**  -   Πρόσθεση


 * -**  -   Αφαίρεση


 * -  Πολλαπλασιασμός


 * /**  -   Διαίρεση


 * -  Εκθετικό ("το x εις την τάδε")


 * %**  -   Υπόλοιπο διαίρεσης

__Παράδειγμα :__

code format="text" echo "This scripts demonstrates the use of arithmetic operators and the syntax of commands" echo
 * 1) ! /bin/bash

a=2 b=5 echo "First we define variable 'a' and variable 'b' :" echo "a=$a and b=$b" echo

echo "Then we define variable 'c' which takes as value the result of different operations:"

let c="a+b" echo "a+b = $c" echo

c=$[ a*b ] echo "a*b = $c" echo

let c="b**a" echo "b^a = $c" echo

c=$[ b%a ] echo "a%b = $c" echo code

Εδώ δηλώνουμε αρχικά δυο μεταβλητές και τους δίνουμε τιμές ως εξής: a=2 και b=5

Στις επόμενες γραμμές κάνουμε διάφορες πράξεις μεταξύ του a και του b και το αποτέλεσμα το παίρνει ως τιμή η μεταβλητή c. Παρατηρούμε ότι υπάρχουν 2 συντακτικοί τρόποι για να χρησιμοποιήσουμε τους τελεστές. Ο πρώτος είναι με την εντολή "let" (για δήλωση μεταβλητής) και τη χρήση διπλών εισαγωγικών "". Ο δεύτερος είναι κατευθείαν με τη χρήση του συμβόλου του δολαρίου και την πράξη μέσα σε αγκύλες [ ].

Επίσης υπάρχουν και οι κατωτέρω αριθμητικοί τελεστές οι οποίοι χρησιμοποιούνται σε μια μεταβλητή κι έχουν άμεσο αποτέλεσμα στην τιμή της:

πχ let "var +=5" σημαίνει "αύξησε την τιμή της μεταβλητής var κατά 5"
 * +=**  -   Αύξηση της μεταβλητής κατά έναν αριθμό

πχ let "var -=3" σημαίνει "μείωσε την τιμή της μεταβλητής var κατά 3"
 * -=**  -   Μείωση της μεταβλητής κατά έναν αριθμό

πχ let "var *=4" σημαίνει "Η νέα τιμή της μεταβλητής var θα γίνει ίση με την παλιά επί 4"
 * =**  -   Πολλαπλασιασμός της μεταβλητής με έναν αριθμό

πχ let "var /=4" σημαίνει "Η νέα τιμή της μεταβλητής var θα γίνει ίση με την παλιά δια 4"
 * /=**  -   Διαίρεση της μεταβλητής με έναν αριθμό


 * Ειδικοί χαρακτήρες, εισαγωγικά και χαρακτήρες διαφυγής (!)**

Στο bash (αλλά και σε όλες τις γλώσσες προγραμματισμού ή μορφές αρχείων!!) υπάρχουν χαρακτήρες ή λέξεις οι οποίοι/ες με τον έναν ή με τον άλλο τρόπο σημαίνουν κάτι. Το ποιο πρόσφατο παράδειγμα είναι το σήμα του δολαρίου ($) που μόλις είδαμε. Αυτό λέει στο bash ότι οι χαρακτήρες που ακολουθούν είναι το όνομα μιας μεταβλητής και θα χρησιμοποιηθεί η τιμή της. Το δολάριο ($) είναι ένας ειδικός χαρακτήρας (special character)

Escape characters (χαρακτήρες διαφυγής) Οι χαρακτήρες διαφυγής χρησιμοποιούνται για την απαλοιφή της ιδιαίτερης σημασίας των ειδικών χαρακτήρων. Για το bash, ο χαρακτήρας διαφυγής είναι η ανάποδη κάθετος (backslash) \

Μονά εισαγωγικά Τα μονά εισαγωγικά (' ') χρησιμοποιούνται για να διατηρήσουν ακριβώς αυτό που περιέχεται ανάμεσά τους. Οι ειδικοί χαρακτήρες αντιμετωπίζονται ως απλοί χαρακτήρες.

Διπλά εισαγωγικά Τα διπλά εισαγωγικά (" ") έχουν την ίδια σημασία με τα μονά με τη διαφορά ότι εξαιρούνται οι ειδικοί χαρακτήρες: 1. Δολάριο ($) 2. Ανάποδα μονά εισαγωγικά - backticks (` `) 3. Ανάποδη κάθετος (\) Τα 1 και 2 διατηρούν τη σημασία τους εάν βρεθούν μέσα σε (" "). Το 3 διατηρεί τη σημασία του μόνο όταν ακολουθείται από ($), (`), ("), (\) ή χαρακτήρα νέας γραμμής (newline). Τότε (η ανάποδη κάθετος) αγνοείται τελείως.

Γράψτε τις παρακάτω γραμμές σ' ένα script, τρέξτε το και προσέξτε τα αποτελέσματα:

code format="text"
 * 1) ! /bin/bash

date=20080805

echo "the variable date value is:" echo $date echo

echo "using backslash:" echo \$date echo

echo "using backticks:" echo `date` echo

echo "using single quotes:" echo '$date' echo

echo "using double quotes:" echo "$date" echo

echo "using single quotes inside double quotes:" echo "'date'" echo

echo "using backticks inside double quotes:" echo "`date`" echo

echo "using backslash inside double quotes:" echo "\$date" echo code

-- Πίνακας περιεχομένων Προηγούμενο (Το πρώτο μου scriptάκι) Επόμενο (Συνθήκες)