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


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


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

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

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

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

MYVAR=3

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

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


echo $MYVAR


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

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


#! /bin/bash
 
# filename        : hello.sh
# Date of creation    : 15 July 2008
# Date of last modification    : 15 August 2008
# Creator            : luckyb
# modified by        : luckyb on 15 August 2008
 
# This is my first script modified
# It clears the screen end outputs the sentence "Hello luckyb" on the screen using a variable
 
# clear the screen
clear
 
#Define the variable which contains my message
MyMessage="Hello luckyb"
 
# Output the message
echo $MyMessage
echo
echo "I forgot to mention:"
# Output the message again
echo "$MyMessage ...again :-)"

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


#! /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"

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

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

echo $SHELL


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

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

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

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

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

 
#! /bin/bash
 
DaysOfWeek=(Monday Tuesday Wednesday Thursday Friday)
echo ${DaysOfWeek[*]}
echo ${DaysOfWeek[0]}
echo ${DaysOfWeek[4]}
 
DaysOfWeek[5]="Saturday"
DaysOfWeek[12]="Sunday"
echo ${DaysOfWeek[*]}

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


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

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


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

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

+ - Πρόσθεση

- - Αφαίρεση

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

/ - Διαίρεση

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

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

Παράδειγμα :


#! /bin/bash
echo "This scripts demonstrates the use of arithmetic operators and the syntax of commands"
echo
 
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

Εδώ δηλώνουμε αρχικά δυο μεταβλητές και τους δίνουμε τιμές ως εξής: 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, τρέξτε το και προσέξτε τα αποτελέσματα:

#! /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


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