Shell Scripting – Μέρος 4ο – Μαθηματικές πράξεις


Στα προηγούμενα άρθρα μιλήσαμε για τις μεταβλητές, πως ορίζουμε μια μεταβλητή, πως ελέγχουμε τη ροή ενός προγράμματος μεσώ των if then else και τέλος αναφερθήκαμε στους βρόχους for while και until. Στο παρόν άρθρο θα πάμε παρακάτω μαθαίνοντας για τις μαθηματικές εκφράσεις που μπορούμε να κάνουμε στο bash.

Προτού ξεκινήσουμε, κάλο είναι να ορίσουμε την έννοια του pipe ή αλλιώς pipeline που είναι ένα από τα πιο χρήσιμα εργαλεία στο bash scripting

Πως δουλεύει ένα pipe/pipeline?

To pipe στέλνει το output (αποτέλεσμα) μιας εντολής σε μια άλλη ως είσοδο, ειδικά όταν θέλουμε να φιλτράρουμε ένα πολύ μεγάλο output το pipe μαζί με το grep μας λύνει τα χεριά. Για παράδειγμα

τρέξτε πρώτα:

dmesg

χαμός ε; Ωραία, αν τώρα θέλουμε μόνο τις γραμμές στις οποίες εμφανίζεται η λέξη VGA (κάρτα γραφικών) τότε μπορούμε να πούμε στο dmesg με ένα pipe | ότι περίμενε και δώσε μου μόνο συγκεκριμένα πράγματα:

dmesg | grep -i VGA

το pipe μας επιτρέπει να φιλτράρουμε το αποτέλεσμα της πρώτης εντολής προκείμενου να πάρουμε αυτό που ζητούμε ως αποτέλεσμα της δεύτερης.

Τα pipes είναι μια πολύ χρήσιμη λειτουργιά του shell και όσο προχωράμε θα κάνουμε συχνά χρήση αυτής.

Μαθηματικές εκφράσεις στο shell

Στον κώδικα του παρόντος άρθρου, παρατηρούμε ότι προσπαθούμε να κάνουμε κάποιες μαθηματικές πράξεις στο τερματικό.

#!/bin/bash

# Μαθηματικές εκφράσεις στο τερματικό

# Πρόσθεση / Αφαίρεση
let a=5+10
echo a=$a

# Πολλαπλασιασμός / διαίρεση
let b=$a*2
echo b=$b

# Αύξηση / μείωση μεταβλητής
let a++
let b--

echo a=$a b=$b

Πιο συγκεκριμένα η let κάνει την πράξη και με την echo έχουμε εκτύπωση αυτής. Επιπλέον με τα ++ ή — έχουμε αύξηση / μείωση της μεταβλητής κατά 1, αλλά δεν είναι μόνο αυτός ο τρόπος με τον οποίο πραγματοποιούμε πράξεις.

#!/bin/bash

# Μαθηματικές εκφράσεις με την expr

k=$( expr 10 \* 5 )
l=$( expr 10 \/ 5 )
echo k=$k
echo l=$l

στο παρόν script μας δείχνει ένα διαφορετικό τρόπο να κάνουμε πράξεις, με τη βοήθεια της expr. H expr αποθηκεύει τα αποτελέσματα στις αντίστοιχες μεταβλητές και επιπλέον η έκφραση συμβόλων όπως τα / και * γίνονται με το πρόθεμα \ , αλλιώς δε θα πραγματοποιηθούν.

Ωστόσο αυτός ο τρόπος δεν είναι ο συνήθης και δε συναντάται συχνά. Περισσότερες φορές θα δούμε τον ακόλουθο τρόπο.

#!/bin/bash
# Αριθμητικές εκφράσεις με τη χρήση διπλών παρενθέσεων
a=$(( 4 + 5 ))
echo $a # 9

a=$((3+5))
echo $a # 8

b=$(( a + 3 ))
echo $b # 11

b=$(( $a + 4 ))
echo $b # 12

(( b++ ))
echo $b # 13

(( b += 3 ))
echo $b # 16

a=$(( 4 * 5 ))
echo $a # 20

αυτός είναι ο προτιμώμενος από τους περισσότερους τρόπος για μαθηματικές πράξεις με ακεραίους στο bash.

Τέλος χρήσιμος είναι και ο τελεστής modulo ο οποίος μας επιστρέφει το ακέραιο υπόλοιπο μιας διαίρεσης. Δηλαδή το

echo $(( 10%3 ))

θα επιστρέψει 1

Υποστήριξη δεκαδικών στο shell

Είδαμε όμως ότι το bash δεν τα πάει και πολύ καλά με τους δεκαδικούς γιατί εγγενώς δεν υπάρχει υποστήριξη. Αν δώσουμε:

echo $(( 100/3 )

θα πάρουμε ως αποτέλεσμα έναν ακέραιο, αν όμως θέλουμε δεκαδικό (float) τι κάνουμε;

$((100/3.0))

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

bc <<< 'scale=2;100/3'

Στην περίπτωση που θέλουμε να προσθέσουμε στο αποτέλεσμα αυτό έναν αριθμό, υπάρχει ο σωστός και ο λάθος τρόπος. Στον επόμενο κώδικα απεικονίζονται και οι 2.

#!/bin/bash

# Πράξεις μεταξύ δεκαδικών και ακεραίων

a=$(bc <<< 'scale=2;100/3')
echo $a
# Ο λάθος τρόπος
let a++
# Ο Σωστός τρόπος
echo $a + 1 | bc

βλέπουμε στην πρώτη γραμμή ότι η εντολή

a=$(bc <<< 'scale=2;100/3')

αποθηκεύει στη μεταβλητή a το αποτέλεσμα της εντολής που βρίσκεται εντός των παρενθέσεων. Όμως εδώ βλέπουμε κάποια νέα στοιχειά. Η πράξη 100/3 συνοδεύεται από την παράμετρο scale που λέει στην bc να εκτυπώσει μόνο τα 2 πρώτα δεκαδικά.

Στην επόμενη εντολή προσπαθούμε να προσαυξήσουμε την a μέσω της let και δε μας αφήνει, ενώ με την τρίτη εντολή κάνουμε την πράξη και η bc μέσω του pipe αναλαμβάνει να παράξει το σωστό αποτέλεσμα.

Τι τις θέλω τις μαθηματικές πράξεις στο bash;

Ακόμη και αν δε σας γεμίζουν το μάτι οι μαθηματικές εκφράσεις στο shell έχουν ιδιαίτερη χρησιμότητα σε περιπτώσεις όπως

  • αν θέλουμε να βάλουμε ένα μετρητή σε ένα loop
  • αν θέλουμε να κάνουμε βασικές πράξεις για να υπολογίσουμε πχ το διαθέσιμο χώρο ή το μέγεθος ενός αρχείου ή το σύνολο αυτών.

Τι μάθαμε;

Στο παρόν άρθρο είδαμε πως μπορούμε να εκτελούμε βασικές μαθηματικές πράξεις στο shell. Σε επόμενο άρθρο θα δούμε πως μπορούμε να κάνουμε έλεγχο της ροής των προγραμμάτων μας, με τη χρήση των Cases.

Όπως πάντα τον κώδικα του σημερινού αλλά και των προηγούμενων άρθρων θα τον βρείτε στο github του Cerebrux στην κατηγορία Bash-Lessons. Όλα τα νέα αλλά και παλιότερα μαθήματα θα τα βρείτε στο λήμμα «μαθήματα shell scripting«

 

Advertisements

Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα:

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση /  Αλλαγή )

Google photo

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση /  Αλλαγή )

Σύνδεση με %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Create a website or blog at WordPress.com

ΠΑΝΩ ↑