Πώς να εργαστείτε με μεταβλητές στο Bash

Οι μεταβλητές είναι ζωτικής σημασίας εάν θέλετε να γράψετε σενάρια και να κατανοήσετε τι θα κάνει στον υπολογιστή σας Linux αυτός ο κώδικας που πρόκειται να αποκόψετε και να επικολλήσετε από τον ιστό. Θα σας ξεκινήσουμε!

Μεταβλητές 101

Οι μεταβλητές ονομάζονται σύμβολα που αντιπροσωπεύουν είτε μια συμβολοσειρά είτε μια αριθμητική τιμή. Όταν τα χρησιμοποιείτε σε εντολές και εκφράσεις, αντιμετωπίζονται σαν να είχατε πληκτρολογήσει την τιμή που έχουν αντί για το όνομα της μεταβλητής.

Για να δημιουργήσετε μια μεταβλητή, απλώς παρέχετε ένα όνομα και μια τιμή για αυτήν. Τα ονόματα των μεταβλητών σας πρέπει να είναι περιγραφικά και να σας υπενθυμίζουν την τιμή που έχουν. Ένα όνομα μεταβλητής δεν μπορεί να ξεκινά με αριθμό, ούτε να περιέχει κενά. Μπορεί, ωστόσο, να ξεκινήσει με μια υπογράμμιση. Εκτός από αυτό, μπορείτε να χρησιμοποιήσετε οποιοδήποτε συνδυασμό κεφαλαίων και πεζών αλφαριθμητικών χαρακτήρων.

Παραδείγματα

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

Θα δημιουργήσουμε τέσσερις μεταβλητές συμβολοσειράς και μία αριθμητική μεταβλητή, this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

Προς το δείτε την τιμή που διατηρείται σε μια μεταβλητή, χρησιμοποιήστε την εντολή echo. Πρέπει να τοποθετείτε πριν από το όνομα της μεταβλητής ένα σύμβολο $ όποτε αναφέρετε την τιμή που περιέχει, όπως φαίνεται παρακάτω:

echo $my_name
echo $my_boost
echo $this_year

ο

Ας χρησιμοποιήσουμε όλες τις μεταβλητές μας ταυτόχρονα:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

ο

Οι τιμές των μεταβλητών αντικαθιστούν τα ονόματά τους. Μπορείτε επίσης να αλλάξετε τις τιμές των μεταβλητών. Για να εκχωρήσετε μια νέα τιμή στη μεταβλητή, my_boost, απλώς επαναλάβετε αυτό που κάνατε όταν εκχωρήσατε την πρώτη της τιμή, όπως:

my_boost=Tequila

ο

Εάν εκτελέσετε ξανά την προηγούμενη εντολή, θα έχετε τώρα ένα διαφορετικό αποτέλεσμα:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Η ηχώ

Έτσι, μπορείτε να χρησιμοποιήσετε την ίδια εντολή που παραπέμπει στις ίδιες μεταβλητές και να λάβετε διαφορετικά αποτελέσματα εάν αλλάξετε τις τιμές που διατηρούνται στις μεταβλητές.

Θα μιλήσουμε για την παράθεση μεταβλητών αργότερα. Προς το παρόν, εδώ είναι μερικά πράγματα που πρέπει να θυμάστε:

Μια μεταβλητή σε μεμονωμένα εισαγωγικά ‘ αντιμετωπίζεται ως κυριολεκτική συμβολοσειρά και όχι ως μεταβλητή.
Οι μεταβλητές σε εισαγωγικά » αντιμετωπίζονται ως μεταβλητές.
Για να λάβετε την τιμή που διατηρείται σε μια μεταβλητή, πρέπει να δώσετε το σύμβολο του δολαρίου $.
Μια μεταβλητή χωρίς το σύμβολο $ παρέχει μόνο το όνομα της μεταβλητής.

Μπορείτε επίσης να δημιουργήσετε μια μεταβλητή που παίρνει την τιμή της από μια υπάρχουσα μεταβλητή ή αριθμό μεταβλητών. Η ακόλουθη εντολή ορίζει μια νέα μεταβλητή που ονομάζεται drink_of_the_Year και της εκχωρεί τις συνδυασμένες τιμές των μεταβλητών my_boost και this_year:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Το ποτό_της_χρονιάς=

Πώς να χρησιμοποιήσετε μεταβλητές σε σενάρια

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

  Τρόπος αντιγραφής, αποκοπής και επικόλλησης σε υπολογιστή με Windows

Πληκτρολογήστε το σε ένα αρχείο κειμένου και, στη συνέχεια, αποθηκεύστε το ως fcnt.sh (για “πλήθος αρχείων”):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Για να μπορέσετε να εκτελέσετε το σενάριο, πρέπει να το κάνετε εκτελέσιμο, όπως φαίνεται παρακάτω:

chmod +x fcnt.sh

Πληκτρολογήστε τα εξής για να εκτελέσετε το σενάριο:

./fcnt.sh

Αυτό εκτυπώνει τον αριθμό των αρχείων στον κατάλογο /dev. Ετσι δουλευει:

Ορίζεται μια μεταβλητή που ονομάζεται folder_to_count και έχει ρυθμιστεί να κρατά τη συμβολοσειρά “/dev”.
Μια άλλη μεταβλητή, που ονομάζεται file_count, ορίζεται. Αυτή η μεταβλητή παίρνει την τιμή της από μια αντικατάσταση εντολής. Αυτή είναι η φράση εντολής ανάμεσα στις παρενθέσεις $( ). Σημειώστε ότι υπάρχει ένα σύμβολο $ πριν από την πρώτη παρένθεση. Αυτή η κατασκευή $( ) αξιολογεί τις εντολές μέσα στις παρενθέσεις και στη συνέχεια επιστρέφει την τελική τους τιμή. Σε αυτό το παράδειγμα, αυτή η τιμή εκχωρείται στη μεταβλητή file_count. Όσον αφορά τη μεταβλητή file_count, έχει περάσει μια τιμή για διατήρηση. δεν ενδιαφέρεται για το πώς αποκτήθηκε η αξία.
Η εντολή που αξιολογήθηκε στην αντικατάσταση εντολών εκτελεί μια λίστα αρχείου ls στον κατάλογο στη μεταβλητή folder_to_count, η οποία έχει οριστεί σε “/dev.” Έτσι, το σενάριο εκτελεί την εντολή “ls /dev”.
Η έξοδος από αυτήν την εντολή διοχετεύεται στην εντολή wc. Η επιλογή -l (αριθμός γραμμών) προκαλεί το wc σε μετρήστε τον αριθμό των γραμμών στην έξοδο από την εντολή ls. Καθώς κάθε αρχείο παρατίθεται σε ξεχωριστή γραμμή, αυτός είναι ο αριθμός των αρχείων και των υποκαταλόγων στον κατάλογο “/dev”. Αυτή η τιμή εκχωρείται στη μεταβλητή file_count.
Η τελική γραμμή χρησιμοποιεί ηχώ για την έξοδο του αποτελέσματος.

Αλλά αυτό λειτουργεί μόνο για τον κατάλογο “/dev”. Πώς μπορούμε να κάνουμε το σενάριο να λειτουργεί με οποιονδήποτε κατάλογο; Το μόνο που χρειάζεται είναι μια μικρή αλλαγή.

Τρόπος χρήσης παραμέτρων γραμμής εντολών σε σενάρια

Πολλές εντολές, όπως το ls και το wc, λαμβάνουν παραμέτρους της γραμμής εντολών. Αυτά παρέχουν πληροφορίες στην εντολή, ώστε να ξέρει τι θέλετε να κάνει. Εάν θέλετε να εργαστείτε στον αρχικό σας κατάλογο και επίσης για εμφάνιση κρυφών αρχείων, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή, όπου το tilde ~ και η επιλογή -a (all) είναι παράμετροι γραμμής εντολών:

ls ~ -a

Τα σενάρια μας μπορούν να δεχτούν παραμέτρους γραμμής εντολών. Αναφέρονται ως $1 για την πρώτη παράμετρο, $2 ως η δεύτερη και ούτω καθεξής, έως και $9 για την ένατη παράμετρο. (Στην πραγματικότητα, υπάρχει και ένα $0, αλλά αυτό είναι δεσμευμένο για να διατηρείται πάντα το σενάριο.)

Μπορείτε να αναφέρετε τις παραμέτρους της γραμμής εντολών σε ένα σενάριο όπως θα κάνατε με τις κανονικές μεταβλητές. Ας τροποποιήσουμε το σενάριό μας, όπως φαίνεται παρακάτω, και ας το αποθηκεύσουμε με το νέο όνομα fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Αυτή τη φορά, στη μεταβλητή folder_to_count εκχωρείται η τιμή της πρώτης παραμέτρου γραμμής εντολών, $1.

  Το Food Builder σας δίνει πληροφορίες για τη διατροφή με βάση τα συστατικά σας

Το υπόλοιπο σενάριο λειτουργεί ακριβώς όπως πριν. Αντί για μια συγκεκριμένη λύση, το σενάριό σας είναι πλέον γενικό. Μπορείτε να το χρησιμοποιήσετε σε οποιονδήποτε κατάλογο, επειδή δεν είναι κωδικοποιημένος για να λειτουργεί μόνο με το “/dev”.

Δείτε πώς μπορείτε να κάνετε το σενάριο εκτελέσιμο:

chmod +x fcnt2.sh

Τώρα, δοκιμάστε το με μερικούς καταλόγους. Μπορείτε να κάνετε “/dev” πρώτα για να βεβαιωθείτε ότι έχετε το ίδιο αποτέλεσμα με πριν. Πληκτρολογήστε τα εξής:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Λαμβάνετε το ίδιο αποτέλεσμα (207 αρχεία) όπως πριν για τον κατάλογο “/dev”. Αυτό είναι ενθαρρυντικό και λαμβάνετε αποτελέσματα ειδικά για τον κατάλογο για καθεμία από τις άλλες παραμέτρους της γραμμής εντολών.

Για να συντομεύσετε το σενάριο, θα μπορούσατε να απορρίψετε τη μεταβλητή, folder_to_count, και απλώς να αναφέρετε το $1 παντού, ως εξής:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Εργασία με ειδικές μεταβλητές

Αναφέραμε το $0, το οποίο ορίζεται πάντα στο όνομα αρχείου του σεναρίου. Αυτό σας επιτρέπει να χρησιμοποιήσετε το σενάριο για να κάνετε πράγματα όπως να εκτυπώσετε σωστά το όνομά του, ακόμα κι αν έχει μετονομαστεί. Αυτό είναι χρήσιμο σε καταστάσεις καταγραφής, στις οποίες θέλετε να μάθετε το όνομα της διαδικασίας που πρόσθεσε μια καταχώρηση.

Οι ακόλουθες είναι οι άλλες ειδικές προκαθορισμένες μεταβλητές:

$#: Πόσες παράμετροι γραμμής εντολών μεταβιβάστηκαν στο σενάριο.
[email protected]: Όλες οι παράμετροι της γραμμής εντολών μεταβιβάστηκαν στο σενάριο.
$?: Η κατάσταση εξόδου της τελευταίας διαδικασίας που εκτελείται.
$$: Το αναγνωριστικό διεργασίας (PID) του τρέχοντος σεναρίου.
$USER: Το όνομα χρήστη του χρήστη που εκτελεί το σενάριο.
$HOSTNAME: Το όνομα κεντρικού υπολογιστή του υπολογιστή που εκτελεί το σενάριο.
$SECONDS: Ο αριθμός των δευτερολέπτων για τα οποία εκτελείται το σενάριο.
$RANDOM: Επιστρέφει έναν τυχαίο αριθμό.
$LINENO: Επιστρέφει τον τρέχοντα αριθμό γραμμής του σεναρίου.

Θέλετε να τα δείτε όλα σε ένα σενάριο, έτσι δεν είναι; Μπορείς! Αποθηκεύστε τα ακόλουθα ως αρχείο κειμένου που ονομάζεται special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: [email protected]"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Πληκτρολογήστε τα παρακάτω για να το κάνετε εκτελέσιμο:

chmod +x special.sh

Τώρα, μπορείτε να το εκτελέσετε με μια δέσμη διαφορετικών παραμέτρων γραμμής εντολών, όπως φαίνεται παρακάτω.

Μεταβλητές Περιβάλλοντος

Το Bash χρησιμοποιεί μεταβλητές περιβάλλοντος για να ορίσει και να καταγράψει τις ιδιότητες του περιβάλλοντος που δημιουργεί κατά την εκκίνηση. Αυτές οι πληροφορίες διατηρούν εύκολα πρόσβαση στο Bash, όπως το όνομα χρήστη, τις τοπικές ρυθμίσεις, τον αριθμό των εντολών που μπορεί να περιέχει το αρχείο ιστορικού σας, τον προεπιλεγμένο επεξεργαστή σας και πολλά άλλα.

Για να δείτε τις ενεργές μεταβλητές περιβάλλοντος στη συνεδρία Bash, χρησιμοποιήστε αυτήν την εντολή:

env | less

ο

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

Τρόπος εξαγωγής μεταβλητών

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

  Πώς να διορθώσετε έναν εκτυπωτή σε κατάσταση σφάλματος στα Windows 10

Αρχικά, αποθηκεύστε τα ακόλουθα με το όνομα αρχείου script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Αυτό δημιουργεί δύο μεταβλητές, first_var και second_var, και εκχωρεί ορισμένες τιμές. Τις εκτυπώνει στο παράθυρο του τερματικού, εξάγει τις μεταβλητές και καλεί το script_two.sh. Όταν το script_two.sh τερματιστεί και η ροή διεργασίας επιστρέφει σε αυτό το σενάριο, εκτυπώνει ξανά τις μεταβλητές στο παράθυρο του τερματικού. Στη συνέχεια, μπορείτε να δείτε αν άλλαξαν.

Το δεύτερο σενάριο που θα χρησιμοποιήσουμε είναι το script_two.sh. Αυτό είναι το σενάριο που το script_one.shcalls. Πληκτρολογήστε τα εξής:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Αυτό το δεύτερο σενάριο εκτυπώνει τις τιμές των δύο μεταβλητών, τους εκχωρεί νέες τιμές και στη συνέχεια τις εκτυπώνει ξανά.

Για να εκτελέσετε αυτά τα σενάρια, πρέπει να πληκτρολογήσετε τα ακόλουθα για να τα κάνετε εκτελέσιμα:

chmod +x script_one.sh
chmod +x script_two.sh

Και τώρα, πληκτρολογήστε τα εξής για να ξεκινήσετε το script_one.sh:

./script_one.sh

Αυτό μας λέει η έξοδος:

Το script_one.sh εκτυπώνει τις τιμές των μεταβλητών, οι οποίες είναι άλφα και μπράβο.
Το script_two.sh εκτυπώνει τις τιμές των μεταβλητών (alpha και bravo) όπως τις έλαβε.
Το script_two.sh τα αλλάζει σε charlie και delta.
Το script_one.sh εκτυπώνει τις τιμές των μεταβλητών, οι οποίες εξακολουθούν να είναι άλφα και μπράβο.

Ό,τι συμβαίνει στο δεύτερο σενάριο, μένει στο δεύτερο σενάριο. Είναι σαν να αποστέλλονται αντίγραφα των μεταβλητών στο δεύτερο σενάριο, αλλά απορρίπτονται όταν κλείνει αυτό το σενάριο. Οι αρχικές μεταβλητές στο πρώτο σενάριο δεν αλλάζουν από τίποτα που συμβαίνει στα αντίγραφά τους στο δεύτερο.

Πώς να αναφέρετε μεταβλητές

Ίσως έχετε παρατηρήσει ότι όταν τα σενάρια αναφέρονται σε μεταβλητές, βρίσκονται σε εισαγωγικά. Αυτό επιτρέπει στις μεταβλητές να αναφέρονται σωστά, επομένως οι τιμές τους χρησιμοποιούνται όταν η γραμμή εκτελείται στο σενάριο.

Εάν η τιμή που εκχωρείτε σε μια μεταβλητή περιλαμβάνει κενά, αυτά πρέπει να βρίσκονται σε εισαγωγικά όταν τα εκχωρείτε στη μεταβλητή. Αυτό συμβαίνει επειδή, από προεπιλογή, το Bash χρησιμοποιεί ένα διάστημα ως οριοθέτη.

Εδώ είναι ένα παράδειγμα:

site_name=How-To Geek

Ο Bash βλέπει το διάστημα πριν από το “Geek” ως ένδειξη ότι ξεκινά μια νέα εντολή. Αναφέρει ότι δεν υπάρχει τέτοια εντολή και εγκαταλείπει τη γραμμή. Το echo μας δείχνει ότι η μεταβλητή site_name δεν περιέχει τίποτα — ούτε καν το κείμενο “How-To”.

Δοκιμάστε το ξανά με εισαγωγικά γύρω από την τιμή, όπως φαίνεται παρακάτω:

site_name="How-To Geek"

όνομα_ιστοτόπου=

Αυτή τη φορά, αναγνωρίζεται ως μία τιμή και εκχωρείται σωστά στη μεταβλητή site_name.

Η echo είναι ο φίλος σου

Μπορεί να χρειαστεί λίγος χρόνος για να συνηθίσετε την αντικατάσταση εντολών, την αναφορά μεταβλητών και να θυμάστε πότε να συμπεριλάβετε το σύμβολο του δολαρίου.

Πριν πατήσετε Enter και εκτελέσετε μια γραμμή εντολών Bash, δοκιμάστε το με την ηχώ μπροστά του. Με αυτόν τον τρόπο, μπορείτε να βεβαιωθείτε ότι αυτό που πρόκειται να συμβεί είναι αυτό που θέλετε. Μπορείτε επίσης να συλλάβετε τυχόν λάθη που μπορεί να έχετε κάνει στη σύνταξη.