Δημιουργία σεναρίων bash. συναρτήσεις bash σε σενάρια. Οροι. Πολλαπλή επιλογή

Για γράφοντας ένα απλό σενάριο bashπρέπει να κάνουμε τα εξής απλά βήματα:

Πώς λειτουργούν όλα:

Η πρώτη γραμμή του σεναρίου μας #!/bin/bash είναι απαραίτητη για την επιτυχή εκτέλεση του σεναρίου μας.

η δεύτερη γραμμή mkdir testdir δημιουργεί τον κατάλογο testdir

η τρίτη γραμμή cd testdir σάς επιτρέπει να μεταβείτε στον δημιουργημένο κατάλογο testdir

εντολή αφήστην επόμενη γραμμή αγγίξτε file1 file2 file3 δημιουργεί τρία αρχεία

και η τελευταία εντολή στη γραμμή του σεναρίου μας ls -al μας επιτρέπει να εμφανίσουμε τα περιεχόμενα του τρέχοντος καταλόγου, στον οποίο, χάρη στην προηγούμενη γραμμή, εμφανίστηκαν τρία κενά αρχεία.

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

Εάν εκτελείτε μια αλυσίδα από μερικές ίδιες εντολές (με σταθερές παραμέτρους) στο Linux κάθε μέρα, τότε μπορεί να έχει νόημα να γράψετε το ίδιο απλό σενάριο bash, που θα σας επιτρέψει να εξοικονομήσετε χρόνο και να αυτοματοποιήσετε την εργασία σας.

Γράψιμο σεναρίων σε Linux (εκμάθηση με παραδείγματα)

———————————————————————————-

1. Εισαγωγή

Τι χρειάζεστε για να γράψετε σενάρια
Ιδιοκτησία εργαλείου γραμμή εντολώνκαι τις απαιτούμενες επιλογές τους.
ΒΑΣΙΚΕΣ ΓΝΩΣΕΙΣ Στα Αγγλικάεπίπεδο δημοτικού σχολείου δεν θα παρεμβαίνει.

Γιατί χρειάζονται σενάρια
Πρώτον, η διαχείριση ενός διακομιστή linux, στον ένα ή τον άλλο βαθμό, καταλήγει στη συστηματική εκτέλεση των ίδιων εντολών. Επιπλέον, δεν είναι απαραίτητο αυτές οι εντολές να εκτελούνται από ένα άτομο. Μπορούν να προγραμματιστούν ώστε να εκτελούνται από μηχανή.
Δεύτερον, ακόμα και το να κάνεις απλώς μια κανονική εργασία που (ξαφνικά) ανέρχεται σε 20-1000 ... επαναλαμβανόμενες πράξεις είναι ΠΟΛΥ πιο εύκολο να εφαρμοστεί σε ένα σενάριο.

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

Πώς να γράψετε ένα σενάριο
Στην περίπτωσή μας, το σενάριο θα είναι αρχείο κειμένουμε χαρακτηριστικά εκτέλεσης. Εάν ένα αρχείο σεναρίου ξεκινά με #!, το οποίο ονομάζεται sha-bang στον κόσμο του UNIX, αυτό λέει στο σύστημα ποιον διερμηνέα να χρησιμοποιήσει για να εκτελέσει το σενάριο. Εάν αυτό είναι δύσκολο να το καταλάβετε, τότε απλώς θυμηθείτε ότι θα αρχίσουμε να γράφουμε όλα τα σενάρια με τη γραμμή #!/bin/bash ή #!/bin/sh και, στη συνέχεια, οι εντολές και τα σχόλια σε αυτά θα φύγουν.

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

Τι σενάρια μπορεί να χρειαστούμε:

    ρύθμιση κανόνων τείχους προστασίας κατά την εκκίνηση του συστήματος.
    δημιουργία αντιγράφων ασφαλείας ρυθμίσεων και δεδομένων.
    εκκίνηση σε μια συγκεκριμένη ώρα (κατά προτίμηση κάθε βράδυ) ενός προγράμματος που σαρώνει τα αρχεία καταγραφής του διακομιστή μεσολάβησης και εκδίδει μια βολική αναφορά Ιστού σχετικά με την ποσότητα της ληφθείσας κίνησης.
    στέλνοντάς μας μέσω ταχυδρομείου πληροφορίες ότι κάποιος έχει αποκτήσει πρόσβαση στον διακομιστή μας μέσω ssh, χρόνου σύνδεσης και διεύθυνσης πελάτη.

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

———————————————————————————-

2. Εκμάθηση γραφής σεναρίων στην εσωτερική γλώσσα BASH
πρωτότυπο: https://www.linuxconfig.org/Bash_scripting_Tutorial

Αυτός ο οδηγός δεν προϋποθέτει καμία προηγούμενη γνώση του τρόπου σύνταξης σεναρίων (εφεξής καλούμενα σενάρια) χρησιμοποιώντας την εσωτερική γλώσσα Bash. Μέσω αυτό το εγχειρίδιοσύντομα θα διαπιστώσετε ότι η συγγραφή σεναρίων είναι μια πολύ εύκολη δουλειά. Ας ξεκινήσουμε το σεμινάριο μας με ένα απλό σενάριο που εκτυπώνει τη συμβολοσειρά "Hello World!" (μετάφραση από τα αγγλικά - Γεια σε όλους!)

1. Σενάριο "Γεια σε όλους"
Ακολουθεί το πρώτο σας παράδειγμα σεναρίου bash:

#!/bin/bash
echo "Hello World"

Αλλάξτε στον κατάλογο που περιέχει το αρχείο μας hello_world.sh και κάντε το εκτελέσιμο:

Κωδικός: Επιλέξτε όλα $ chmod +x hello_world.sh

Εκτελέστε το σενάριο για εκτέλεση

Κωδικός: Επιλέξτε όλα τα $ ./hello_world.sh

2. Ένα απλό σενάριο αρχειοθέτησης bash

#!/bin/bash
tar -czf myhome_directory.tar.gz /home/user

Κωδικός: Επιλέξτε όλα τα $ ./backup.sh

$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz

3. Εργασία με μεταβλητές
ΣΕ αυτό το παράδειγμαδηλώνουμε μια απλή μεταβλητή και την εμφανίζουμε στην οθόνη χρησιμοποιώντας την εντολή echo

#!/bin/bash
STRING="ΓΕΙΑ ΣΟΥ ΚΟΣΜΟ!!!"
ηχώ $STRING

Κωδικός: Επιλέξτε όλα τα $ ./hello_world.sh
ΓΕΙΑ ΣΟΥ ΚΟΣΜΕ!!!

Το σενάριο αρχειοθέτησής μας με μεταβλητές:

#!/bin/bash
OF=myhome_directory_$(ημερομηνία +%Y%m%d).tar.gz
IF=/home/user
tar -czf $OF $IF

Κωδικός: Επιλέξτε όλα τα $ ./backup.sh
tar: Αφαίρεση του αρχικού "\" από τα ονόματα μελών
$ du -sh *tar.gz
41M myhome_directory_20100123.tar.gz

3.1 Καθολικές και τοπικές μεταβλητές

#!/bin/bash
# Δηλώστε μια καθολική μεταβλητή
# Αυτή η μεταβλητή μπορεί να χρησιμοποιηθεί οπουδήποτε σε αυτό το σενάριο
VAR = "παγκόσμια μεταβλητή"
λειτουργία bash(
# Δηλώστε μια τοπική μεταβλητή
# Μια τέτοια μεταβλητή ισχύει μόνο για τη συνάρτηση στην οποία έχει δηλωθεί
local VAR =τοπικές μεταβλητές
echo $VAR
}
echo $VAR
κτυπώ δυνατά
# Σημειώστε ότι η καθολική μεταβλητή δεν έχει αλλάξει
echo $VAR

Κωδικός: Επιλέξτε όλα τα $ ./variables.sh
καθολική μεταβλητή
τοπική μεταβλητή
καθολική μεταβλητή

4. Μετάδοση επιχειρημάτων στο σενάριο

#!/bin/bash
# Χρησιμοποιήστε προκαθορισμένες μεταβλητές για πρόσβαση σε ορίσματα
# Εκτύπωση ορισμάτων στην οθόνη
echo $1 $2 $3 " -> echo $1 $2 $3"

#Μπορούμε επίσης να έχουμε πρόσβαση στα ορίσματα μέσω ενός ειδικού πίνακα args=(" [email προστατευμένο]»)
# Εκτύπωση ορισμάτων στην οθόνη
echo $(args) $(args) $(args) ‘ -> args=(“ [email προστατευμένο]»); ηχώ $(args) $(args) $(args)'

# Χρησιμοποιήστε μια μεταβλητή [email προστατευμένο]για να εμφανιστούν όλα τα ορίσματα ταυτόχρονα
ηχώ [email προστατευμένο]' -> ηχώ [email προστατευμένο]

Χρησιμοποιήστε τη μεταβλητή $# για να εμφανίσετε τον αριθμό των ορισμάτων που μεταβιβάστηκαν στο σενάριο
echo Αριθμός ορισμάτων που πέρασαν: $# ' -> echo Αριθμός ορισμάτων που πέρασαν: $#'

Κωδικός: Επιλέξτε όλα τα $ ./arguments.sh Οδηγίες δέσμης ενεργειών Bash
Οδηγός δέσμης ενεργειών Bash -> echo $1 $2 $3
Εκμάθηση σεναρίων Bash -> args=(" [email προστατευμένο]"); echo $(args) $(args) $(args)
Οδηγός σεναρίου Bash -> echo [email προστατευμένο]
Αριθμός ορισμάτων που πέρασαν: 3 -> echo Αριθμός ορισμάτων που πέρασαν: $#

5. Εκτέλεση εντολών Shell σε σενάριο

#!/bin/bash
# χρησιμοποιήστε backticks » ` ` » για να εκτελέσετε μια εντολή φλοιού
ηχώ `unname -o`
# τώρα ας προσπαθήσουμε χωρίς εισαγωγικά
ηχώ uname -ο

Κωδικός: Επιλέξτε όλα τα $ uname -o
GNU/Linux
$ ./bash_backtricks.sh
GNU/Linux
ονομα-ο

Όπως μπορείτε να δείτε, στη δεύτερη περίπτωση, εμφανίστηκε η ίδια η εντολή και όχι το αποτέλεσμα της εκτέλεσής της.

6. Ανάγνωση εισόδου χρήστη (διαδραστικότητα)

#!/bin/bash
echo -e "Γεια, πληκτρολογήστε τη λέξη: \c"
διαβάστε λέξη
echo "Η λέξη που εισαγάγατε είναι: $word"
echo -e «Μπορείς σε παρακαλώ να εισάγεις δύο λέξεις; »
διαβάστε λέξη1 λέξη2
echo "Εδώ είναι η εισαγωγή σας: \"$word1\" \"$word2\""
echo -e «Πώς αισθάνεσαι για το bash scripting; »
Η εντολή # read αποθηκεύει τώρα μια απάντηση στην προεπιλεγμένη ενσωματωμένη μεταβλητή $REPLY
ανάγνωση
echo "Είπες $REPLY, χαίρομαι που το ακούω! »
echo -e «Ποια είναι τα αγαπημένα σου χρώματα; »
# -a κάνει την εντολή ανάγνωσης για ανάγνωση σε έναν πίνακα
διάβασε -α χρώματα
echo "Τα αγαπημένα μου χρώματα είναι επίσης $(colours), $(colours) και $(colours):-)"

Κωδικός: Επιλέξτε όλα τα $ ./read.sh
Γεια, πληκτρολογήστε τη λέξη: κάτι
Η λέξη που εισαγάγατε είναι: κάτι
Μπορείτε να εισάγετε δύο λέξεις;
Debian Linux
Εδώ είναι η εισαγωγή σας: "Debian" "Linux"
Πώς νιώθετε για το bash scripting;
Καλός
Καλά τα είπες, χαίρομαι που το ακούω!
Ποια είναι τα αγαπημένα σας χρώματα;
μπλε πράσινο μαύρο
Τα αγαπημένα μου χρώματα είναι επίσης το μπλε, το πράσινο και το μαύρο :-)

7. Χρήση της παγίδας

#!/bin/bash
# δηλώστε παγίδα
παγίδα bashtrap ΙΝΤ
# εκκαθάριση της οθόνης
Σαφή;
# η λειτουργία hook εκτελείται όταν ο χρήστης πατήσει CTRL-C:
# Θα εμφανιστεί => Εκτέλεση υπορουτίνας bash trap !
# αλλά το σενάριο θα συνεχίσει να εκτελείται
bashtrap()
{
echo "Εντοπίστηκε CTRL+C !…εκτέλεση bash trap!"
}
# το σενάριο θα μετρήσει μέχρι το 10
για ένα σε `seq 1 10`; κάνω
echo "$a/10 to Exit."
ύπνος1;
Ολοκληρώθηκε
echo "Exit Bash Trap Example!!!"

Κωδικός: Επιλέξτε όλα τα $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL+C Εντοπίστηκε !...εκτέλεση bash trap !
10/10
Παράδειγμα Exit Bash Trap!!!

Όπως μπορείτε να δείτε, ο συνδυασμός πλήκτρων Ctrl-C δεν σταμάτησε την εκτέλεση του σεναρίου.

8. Πίνακες
8.1 Δήλωση ενός απλού πίνακα

#!/bin/bash
# Δηλώστε έναν απλό πίνακα με 4 στοιχεία
ARRAY=('Debian Linux' 'Redhat Linux' ubuntu linux)
# Λάβετε τον αριθμό των στοιχείων στον πίνακα
ΣΤΟΙΧΕΙΑ=$(#ΣΥΝΑΛΗ[@])

# βρόχος μέσα από κάθε στοιχείο του πίνακα
για ((i=0;i<$ELEMENTS;i++)); do
echo $(ARRAY[$(i)])
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $./arrays.sh
Debian Linux
redhat linux
ubuntu
linux

8.2 Συμπλήρωση πίνακα με τιμές από αρχείο

#!/bin/bash
# Δηλώστε έναν πίνακα
δηλώνω -a ARRAY
# εντολή exec Από αυτό το αρχείο θα δημιουργηθεί # stdin (συνήθως το πληκτρολόγιο). Αυτό καθιστά δυνατή την ανάγνωση
# τα περιεχόμενα του αρχείου, γραμμή προς γραμμή, και αναλύστε κάθε γραμμή που εισάγεται με sed και/ή awk.
εκτελεστικό 10 letcount=0

ενώ διαβάζετε LINE<&10; do

ΠΙΝΑΚΑΣ[$count]=$LINE
((μέτρηση++))
Ολοκληρώθηκε

echo Αριθμός στοιχείων: $(#ARRAY[@])
# Εμφάνιση τιμών πίνακα
echo $(ARRAY[@])
# κλείσιμο του αρχείου
exec 10>&-

Κωδικός: Επιλέξτε όλα τα $ cat bash.txt
Debian Linux
redhat linux
ubuntu
linux
$ ./arrays.sh
Αριθμός στοιχείων: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Εάν-τότε-αλλιώς προϋποθέσεις
9.1. Απλή χρήση των συνθηκών «αν-άλλο».
Δώστε προσοχή στους χώρους σε αγκύλες, χωρίς τους οποίους η συνθήκη δεν θα λειτουργήσει.

#!/bin/bash
directory="./BashScripting"

# ελέγξτε αν υπάρχει ο κατάλογος
εάν [ -d $directory ]; έπειτα
echo "Ο κατάλογος υπάρχει"
αλλού
echo "Ο κατάλογος δεν υπάρχει"
fi

Κωδικός: Επιλέξτε όλα τα $ ./if_else.sh
Ο κατάλογος δεν υπάρχει
$ mkdir BashScripting
$ ./if_else.sh
Ο κατάλογος υπάρχει

9.2 Ένθετες συνθήκες if-else

#!/bin/bash
# Δηλώστε μια μεταβλητή με τιμή 4
επιλογή=4
# Απεικόνιση
ηχώ «1. κτυπώ δυνατά"
ηχώ «2. Σενάριο»
ηχώ «3. Φροντιστήριο"

# Εκτελέστε ενώ η μεταβλητή είναι ίση με τέσσερα
# βρόχος
ενώ [ $choice -eq 4 ]; κάνω

# ανάγνωση εισόδου χρήστη
διαβάστε την επιλογή
# ένθετη συνθήκη "if-else".
if [ $choice -eq 1 ] ; έπειτα

echo "Έχετε επιλέξει λέξη: Bash"

if [ $choice -eq 2 ] ; έπειτα
echo "Έχετε επιλέξει λέξη: Σενάριο"
αλλού

if [ $choice -eq 3 ] ; έπειτα
echo "Έχετε επιλέξει λέξη: Εκμάθηση"
αλλού
echo "Παρακαλώ κάντε μια επιλογή μεταξύ 1-3!"
ηχώ «1. κτυπώ δυνατά"
ηχώ «2. Σενάριο»
ηχώ «3. Φροντιστήριο"
echo -n "Παρακαλώ επιλέξτε μια λέξη; »
επιλογή=4
fi
fi
fi
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ./nested.sh
1. μπας
2. Σενάριο
3. Φροντιστήριο

5

1. μπας
2. Σενάριο
3. Φροντιστήριο
Παρακαλώ επιλέξτε μια λέξη
4
Κάντε μια επιλογή μεταξύ 1-3!
1. μπας
2. Σενάριο
3. Φροντιστήριο
Παρακαλώ επιλέξτε μια λέξη
3
Έχετε επιλέξει λέξη: Tutorial

Έτσι, πρώτα εκτελείται το σώμα του βρόχου "while", γιατί η μεταβλητή επιλογή ορίζεται αρχικά σε τέσσερα. Στη συνέχεια διαβάζουμε την είσοδο του χρήστη σε αυτό και εάν η είσοδος δεν είναι ίση με 1,2 ή 3, τότε κάνουμε τη μεταβλητή μας ίση με 4 ξανά, σε σχέση με την οποία επαναλαμβάνεται το σώμα του βρόχου (πρέπει να εισαγάγετε ξανά 1,2 ή 3).

10. Συγκρίσεις
10.1 Αριθμητικές συγκρίσεις

Lt<
-gt>
-le<=
-ge >=
-eq ==
-νε !=

#!/bin/bash

NUM1=2
NUM2=2
εάν [ $NUM1 -eq $NUM2 ]; έπειτα
echo "Και οι δύο αξίες είναι ίσες"
αλλού
ηχώ "Οι αξίες ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./equals.sh
Και οι δύο αξίες είναι ίσες

#!/bin/bash
# Δηλώστε μεταβλητές με ακέραιες τιμές
NUM1=2
NUM2=3
εάν [ $NUM1 -eq $NUM2 ]; έπειτα
echo "Και οι δύο αξίες είναι ίσες"
αλλού
ηχώ "Οι αξίες ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./equals.sh
Οι αξίες ΔΕΝ είναι ίσες

#!/bin/bash
# Δηλώστε μεταβλητές με ακέραιες τιμές
NUM1=2
NUM2=1
εάν [ $NUM1 -eq $NUM2 ]; έπειτα
echo "Και οι δύο αξίες είναι ίσες"
elif [ $NUM1 -gt $NUM2 ]; έπειτα
ηχώ "$NUM1 είναι μεγαλύτερο από $NUM2"
αλλού
ηχώ "$NUM2 είναι μεγαλύτερο από $NUM1"
fi

Κωδικός: Επιλέξτε όλα τα $ ./equals.sh
Το 2 είναι μεγαλύτερο από το 1

10.2 Συγκρίσεις χαρακτήρων-κειμένου

Το ίδιο
!= όχι το ίδιο
< меньще чем
> περισσότερο από
-n s1 μεταβλητή s1 δεν είναι κενή
-z s1 μεταβλητή s1 είναι κενή

#!/bin/bash

S1="Bash"

S2="Scripting"
εάν [ $S1 = $S2 ]; έπειτα

αλλού
echo "Οι χορδές ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./statement.sh
Οι χορδές ΔΕΝ είναι ίσες

#!/bin/bash
# Δηλώστε τη συμβολική μεταβλητή S1
S1="Bash"
# Δηλώστε τη συμβολική μεταβλητή S2
S2="Bash"
εάν [ $S1 = $S2 ]; έπειτα
echo "Και οι δύο χορδές είναι ίσες"
αλλού
echo "Οι χορδές ΔΕΝ είναι ίσες"
fi

Κωδικός: Επιλέξτε όλα τα $ ./statement.sh
Και οι δύο χορδές είναι ίσες

11. Έλεγχος αρχείων

Όνομα αρχείου B Αποκλεισμός ειδικού αρχείου
-c όνομα αρχείου Αρχείο ειδικού χαρακτήρα
-d όνομα καταλόγου Έλεγχος ύπαρξης καταλόγου
-e όνομα αρχείου Έλεγχος ύπαρξης αρχείου
-f όνομα αρχείου Ελέγξτε για κανονική ύπαρξη αρχείου και όχι καταλόγου
-Όνομα αρχείου G Ελέγξτε εάν το αρχείο υπάρχει και ανήκει σε πραγματικό αναγνωριστικό ομάδας.
-g όνομα αρχείου true αν υπάρχει αρχείο και είναι set-group-id.
-k όνομα αρχείου Sticky bit
-L όνομα αρχείου Συμβολικός σύνδεσμος
-O όνομα αρχείου True αν υπάρχει αρχείο και ανήκει στο πραγματικό αναγνωριστικό χρήστη.
-r όνομα αρχείου Ελέγξτε εάν το αρχείο είναι αναγνώσιμο
-S filename Ελέγξτε εάν το αρχείο είναι υποδοχή
Όνομα αρχείου -s Ελέγξτε εάν το μέγεθος του αρχείου δεν είναι μηδενικό
-u όνομα αρχείου Ελέγξτε αν έχει οριστεί το bit αρχείου set-ser-id
-w όνομα αρχείου Ελέγξτε εάν το αρχείο είναι εγγράψιμο
-x όνομα αρχείου Ελέγξτε εάν το αρχείο είναι εκτελέσιμο

#!/bin/bash
file="./file"
εάν [ -e $file ]; έπειτα
echo "Το αρχείο υπάρχει"
αλλού
echo "Το αρχείο δεν υπάρχει"
fi

Κωδικός: Επιλέξτε όλα τα $ ls
αρχείο.sh
$ ./file.sh
Το αρχείο δεν υπάρχει
$ αρχείο αφής
$ls
αρχείο file.sh
$ ./file.sh
Το αρχείο υπάρχει

Ομοίως για το παράδειγμα μπορούμε να χρησιμοποιήσουμε βρόχους "while" για να ελέγξουμε αν το αρχείο δεν υπάρχει. Αυτό το σενάριο θα αδράνει μέχρι να υπάρξει το αρχείο. Σημειώστε το αρνητικό Bash "!" που αναιρεί (αναστρέφει) την επιλογή -e.

12. Κύκλοι
12.1. Για βρόχο

#!/bin/bash
# για βρόχο
για f σε $(ls /var/); κάνω
ηχώ $f
Ολοκληρώθηκε

Εκτέλεση ενός βρόχου for από τη γραμμή εντολών bash:

Κωδικός: Επιλέξτε όλα τα $ για f σε $(ls /var/); κάνω echo $f; done Code: Επιλέξτε όλα τα $ για f σε $(ls /var/); κάνω echo $f; Ολοκληρώθηκε
αντίγραφα ασφαλείας
κρύπτη
σύγκρουση
Παιχνίδια
lib
τοπικός
κλειδαριά
κούτσουρο
ταχυδρομείο
επιλέγω
τρέξιμο
πηνίο
tmp
www

12.2. ενώ βρόχος

#!/bin/bash
COUNT=6
βρόχος # while
ενώ [ $COUNT -gt 0 ]; κάνω

ας COUNT=COUNT-1
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ./while_loop.sh
Η τιμή της καταμέτρησης είναι: 6
Η τιμή της καταμέτρησης είναι: 5
Η τιμή της καταμέτρησης είναι: 4
Η τιμή της καταμέτρησης είναι: 3
Η τιμή της καταμέτρησης είναι: 2
Η τιμή της καταμέτρησης είναι: 1

12.3. μέχρι βρόχου

#!/bin/bash
COUNT=0
#έως βρόχο
έως [ $COUNT -gt 5 ]; κάνω
echo Η τιμή του πλήθους είναι: $COUNT
ας COUNT=COUNT+1
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ./until_loop.sh
Η τιμή της καταμέτρησης είναι: 0
Η τιμή της καταμέτρησης είναι: 1
Η τιμή της καταμέτρησης είναι: 2
Η τιμή της καταμέτρησης είναι: 3
Η τιμή της καταμέτρησης είναι: 4
Η τιμή της καταμέτρησης είναι: 5

12.4. Βρόχοι με σιωπηρές συνθήκες
Στο παρακάτω παράδειγμα, η συνθήκη του βρόχου while είναι η παρουσία τυπικής εισόδου.
Το σώμα του βρόχου θα λειτουργεί όσο υπάρχει κάτι που πρέπει να ανακατευθυνθεί από την τυπική έξοδο στην εντολή ανάγνωσης.

#!/bin/bash
# Αυτό το σενάριο θα βρει και θα αφαιρέσει κενά
# σε αρχεία, αντικαθιστώντας τα με υπογράμμιση
DIR="."
Έλεγχος του βρόχου με την εντολή ανάγνωσης ανακατευθύνοντας την έξοδο στον βρόχο.
βρείτε $DIR -τύπος f | κατά την ανάγνωση του αρχείου? κάνω
# χρησιμοποιήστε την κλάση POSIX [:space:] για να βρείτε κενά στα ονόματα αρχείων
εάν [[ "$file" = *[[:space:]]* ]]; έπειτα
# αντικαταστήστε τα κενά με υπογράμμιση
mv "$file" `echo $file | tr ‘ ‘ ‘_’’
fi;
Ολοκληρώθηκε

Κωδικός: Επιλέξτε όλα τα $ ls -1
σενάριο.sh
$ αγγίξτε "αρχείο με κενά"
$ ls -1
αρχείο με κενά
σενάριο.sh
$ ./script.sh
$ ls -1
file_with_space
σενάριο.sh

13. Λειτουργίες

#!/bin/bash
# Οι συναρτήσεις μπορούν να δηλωθούν με οποιαδήποτε σειρά
συνάρτηση συνάρτηση_Β(
ηχώ Λειτουργία Β.
}
συνάρτηση συνάρτηση_A(
ηχώ $1
}
συνάρτηση συνάρτηση_D(
echo Λειτουργία D.
}
συνάρτηση_C(
ηχώ $1
}
# Λειτουργίες κλήσης
# περάστε την παράμετρο στη συνάρτηση A
function_A "Συνάρτηση Α."
συνάρτηση_Β
# περάστε την παράμετρο στη συνάρτηση C
function_C "Συνάρτηση C."
συνάρτηση_Δ

Κωδικός: Επιλέξτε όλα τα $ ./functions.sh
Λειτουργία Α.
Λειτουργία Β.
Λειτουργία Γ.
Συνάρτηση Δ.

14. Επιλογή χειριστή - Επιλογή

#!/bin/bash
PS3='Διαλέξτε μία λέξη:'
# επιλέξτε
επιλέξτε λέξη στο "linux" "bash" "scripting" "tutorial"
κάνω
echo "Η λέξη που επιλέξατε είναι: $word"
# Σπάστε, διαφορετικά ο βρόχος θα είναι άπειρος.
Διακοπή
Ολοκληρώθηκε
έξοδος 0

Κωδικός: Επιλέξτε όλα τα $ ./select.sh
1) linux
2) μπας
3) σενάριο
4) φροντιστήριο
Επιλέξτε μία λέξη: 4
Η λέξη που επιλέξατε είναι: tutorial

15. Χειριστής επιλογής - Περίπτωση

#!/bin/bash
echo "Ποια είναι η προτιμώμενη γλώσσα προγραμματισμού/σεναρίου"
ηχώ "1) bash"
echo "2) perl"
ηχώ "3) φυτών"
ηχώ "4) c++"
ηχώ "5) Δεν ξέρω!"
ανάγνωση περίπτωση?
# μια απλή δομή επιλογής περίπτωσης
# σημειώστε ότι σε αυτό το παράδειγμα η $case είναι απλώς μια μεταβλητή
# και δεν χρειάζεται να λέγεται έτσι. Αυτό είναι απλώς ένα παράδειγμα
$περίπτωση μέσα
1) echo "Επιλέξατε το bash";;
2) echo "Επιλέξατε την perl";;
3) echo "Εσείς επιλέξατε φυτών";;
4) echo "Επιλέξατε c++";;
5) έξοδος
esac

Κωδικός: Επιλέξτε όλα τα $ ./case.sh
Ποια είναι η γλώσσα προγραμματισμού/σεναρίου που προτιμάτε
1) bash
2) perl
3) φυτών
4) c++
5) Δεν ξέρω!
4
Επιλέξατε c++

———————————————————————————-

Περισσότερες λεπτομερείς πληροφορίες μπορείτε να λάβετε από διάφορες πηγές, για παράδειγμα εδώ
πρωτότυπο: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin … -book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296

Σήμερα θα μιλήσουμε για τα σενάρια bash. Αυτά είναι σενάρια γραμμής εντολών γραμμένα για το κέλυφος bash. Υπάρχουν και άλλα κελύφη, όπως zsh, tcsh, ksh, αλλά θα επικεντρωθούμε στο bash. Αυτό το υλικό προορίζεται για όλους, η μόνη προϋπόθεση είναι η δυνατότητα εργασίας στη γραμμή εντολών Linux.



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

Έτσι, αν μιλάμε για τη γραμμή εντολών, σας επιτρέπει να εκτελέσετε πολλές εντολές ταυτόχρονα, εισάγοντάς τις με ερωτηματικό:

pwd ; ποιός είμαι
Στην πραγματικότητα, αν το έχετε δοκιμάσει στο τερματικό σας, το πρώτο σας σενάριο bash που χρησιμοποιεί δύο εντολές έχει ήδη γραφτεί. Δουλεύει κάπως έτσι. Η εντολή pwd εμφανίζει πρώτα πληροφορίες σχετικά με τον τρέχοντα κατάλογο εργασίας και, στη συνέχεια, η εντολή whoami εμφανίζει πληροφορίες σχετικά με τον χρήστη από τον οποίο είστε συνδεδεμένοι.

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

Getconf ARG_MAX
Η γραμμή εντολών είναι ένα εξαιρετικό εργαλείο, αλλά πρέπει να εισάγετε εντολές σε αυτήν κάθε φορά που τις χρειάζεστε. Τι γίνεται αν γράψουμε ένα σύνολο εντολών σε ένα αρχείο και απλά καλέσουμε αυτό το αρχείο για να τις εκτελέσει; Στην πραγματικότητα, το αρχείο για το οποίο μιλάμε ονομάζεται σενάριο της γραμμής εντολών.

Πώς λειτουργούν τα σενάρια bash

Δημιουργήστε ένα κενό αρχείο χρησιμοποιώντας την εντολή αφής. Στην πρώτη του γραμμή, πρέπει να καθορίσετε ποιο κέλυφος πρόκειται να χρησιμοποιήσουμε. Μας ενδιαφέρει το bash , οπότε η πρώτη γραμμή του αρχείου θα είναι:

#!/bin/bash
Σε άλλο σημείο αυτού του αρχείου, το σύμβολο κατακερματισμού χρησιμοποιείται για να υποδείξει σχόλια που δεν επεξεργάζεται το κέλυφος. Ωστόσο, η πρώτη γραμμή είναι μια ειδική περίπτωση, όπου ένα σημάδι κατακερματισμού ακολουθούμενο από ένα θαυμαστικό (που ονομάζεται shebang) και μια διαδρομή bash υποδεικνύουν στο σύστημα ότι το σενάριο γράφτηκε ειδικά για το bash .

Οι εντολές φλοιού διαχωρίζονται από μια τροφοδοσία γραμμής, τα σχόλια χωρίζονται με ένα σύμβολο λίρας. Δείτε πώς φαίνεται:

#!/bin/bash # Αυτό είναι ένα σχόλιο pwd whoami
Εδώ, όπως και στη γραμμή εντολών, μπορείτε να γράψετε εντολές σε μία γραμμή, χωρίζοντάς τες με ένα ερωτηματικό. Ωστόσο, εάν γράφετε εντολές σε διαφορετικές γραμμές, το αρχείο είναι πιο ευανάγνωστο. Σε κάθε περίπτωση, το κέλυφος θα τα επεξεργαστεί.

Ρύθμιση δικαιωμάτων σε ένα αρχείο δέσμης ενεργειών

Αποθηκεύστε το αρχείο, ονομάζοντάς το myscript , και έχετε σχεδόν τελειώσει με το σενάριο bash. Τώρα το μόνο που μένει να κάνετε είναι να κάνετε αυτό το αρχείο εκτελέσιμο, διαφορετικά, όταν προσπαθήσετε να το εκτελέσετε, θα αντιμετωπίσετε ένα σφάλμα Permission denied.


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

Ας κάνουμε το αρχείο εκτελέσιμο:

Chmod +x ./myscript
Τώρα ας προσπαθήσουμε να το εκτελέσουμε:

./myscript
Μετά τη ρύθμιση των δικαιωμάτων, όλα λειτουργούν όπως θα έπρεπε.


Επιτυχής εκτέλεση του σεναρίου bash

Έξοδος μηνύματος

Η εντολή echo χρησιμοποιείται για την εκτύπωση κειμένου στην κονσόλα Linux. Ας χρησιμοποιήσουμε τη γνώση αυτού του γεγονότος και ας επεξεργαστούμε το σενάριό μας, προσθέτοντας επεξηγήσεις στα δεδομένα που εμφανίζουν οι εντολές που υπάρχουν ήδη σε αυτό:

#!/bin/bash # το σχόλιό μας είναι εδώ echo "Ο τρέχων κατάλογος είναι:" pwd echo "Ο χρήστης που έχει συνδεθεί είναι:" whoami
Δείτε τι συμβαίνει μετά την εκτέλεση του ενημερωμένου σεναρίου.


Εξαγωγή μηνυμάτων από σενάριο

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

Χρήση μεταβλητών

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

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

Υπάρχουν δύο τύποι μεταβλητών που μπορούν να χρησιμοποιηθούν στα σενάρια bash:

  • Μεταβλητές Περιβάλλοντος
  • Μεταβλητές χρήστη

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

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

#!/bin/bash # display echo αρχικής χρήστη "Η αρχική σελίδα για τον τρέχοντα χρήστη είναι: $HOME"
Λάβετε υπόψη ότι μπορούμε να χρησιμοποιήσουμε τη μεταβλητή συστήματος $HOME σε διπλά εισαγωγικά, αυτό δεν θα εμποδίσει το σύστημα να την αναγνωρίσει. Δείτε τι συμβαίνει εάν εκτελέσετε το παραπάνω σενάριο.


Χρήση μεταβλητής περιβάλλοντος σε σενάριο

Τι γίνεται όμως αν θέλετε να εμφανίσετε ένα σύμβολο του δολαρίου; Ας δοκιμάσουμε αυτό:

Echo "Έχω 1 $ στην τσέπη μου"
Το σύστημα θα εντοπίσει ένα σύμβολο του δολαρίου σε μια συμβολοσειρά που οριοθετείται από εισαγωγικά και θα υποθέσει ότι έχουμε αναφέρει μια μεταβλητή. Το σενάριο θα προσπαθήσει να εμφανίσει την τιμή της μη καθορισμένης μεταβλητής $1 . Αυτό δεν είναι αυτό που χρειαζόμαστε. Τι να κάνω?

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

Echo "Έχω \$1 στην τσέπη μου"
Το σενάριο θα βγάζει τώρα ακριβώς αυτό που αναμένεται.


Χρησιμοποιώντας μια ακολουθία διαφυγής για την έξοδο ενός δολαρίου

Μεταβλητές χρήστη

Εκτός από τις μεταβλητές περιβάλλοντος, τα σενάρια bash σάς επιτρέπουν να ορίσετε και να χρησιμοποιήσετε τις δικές σας μεταβλητές στο σενάριο. Τέτοιες μεταβλητές διατηρούν μια τιμή μέχρι να τελειώσει το σενάριο.

Όπως και με τις μεταβλητές συστήματος, οι μεταβλητές χρήστη μπορούν να προσπελαστούν χρησιμοποιώντας το σύμβολο του δολαρίου:
TNW-CUS-FMP - κωδικός προσφοράς για 10% έκπτωση στις υπηρεσίες μας, διαθέσιμος για ενεργοποίηση εντός 7 ημερών
#!/bin/bash # testing variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade"
Εδώ είναι τι συμβαίνει μετά την εκτέλεση ενός τέτοιου σεναρίου.


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

Αντικατάσταση εντολών

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

Αυτό μπορεί να γίνει με δύο τρόπους.

  • Με τον χαρακτήρα "`"
  • Με την κατασκευή $().
Όταν χρησιμοποιείτε την πρώτη προσέγγιση, προσέξτε να μην χρησιμοποιήσετε ούτε ένα απόσπασμα αντί για ένα backtick. Η εντολή πρέπει να περικλείεται σε δύο τέτοια εικονίδια:

mydir=`pwd`
Στη δεύτερη προσέγγιση, το ίδιο γράφεται ως εξής:

mydir=$(pwd)
Και το σενάριο, στο τέλος, μπορεί να μοιάζει με αυτό:

#!/bin/bash mydir=$(pwd) echo $mydir
Κατά τη διάρκεια της εργασίας της, η έξοδος της εντολής pwd θα αποθηκευτεί στη μεταβλητή mydir, τα περιεχόμενα της οποίας, χρησιμοποιώντας την εντολή echo, θα πέφτουν στην κονσόλα.


Σενάριο που αποθηκεύει τα αποτελέσματα της εντολής σε μια μεταβλητή

Μαθηματικές πράξεις

Για να εκτελέσετε μαθηματικές πράξεις σε ένα αρχείο σεναρίου, μπορείτε να χρησιμοποιήσετε μια κατασκευή όπως $((a+b)):

#!/bin/bash var1=$((5 + 5)) echo $var1 var2=$(($var1 * 2)) echo $var2


Μαθηματικές πράξεις σε σενάριο

αν-τότε δομή ελέγχου

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

Εάν η εντολή τότε δίνει εντολή fi
Και εδώ είναι ένα παράδειγμα εργασίας:

#!/bin/bash αν pwd τότε επαναλάβετε το "Λειτουργεί" fi
Σε αυτήν την περίπτωση, εάν η εντολή pwd ολοκληρωθεί με επιτυχία, το κείμενο "λειτουργεί" θα εκτυπωθεί στην κονσόλα.

Ας χρησιμοποιήσουμε τις γνώσεις που έχουμε και ας γράψουμε ένα πιο σύνθετο σενάριο. Ας υποθέσουμε ότι θέλετε να βρείτε έναν χρήστη στο /etc/passwd , και αν μπορείτε να τον βρείτε, αναφέρετε ότι υπάρχει.

#!/bin/bash user=likegeeks if grep $user /etc/passwd τότε echo "Ο χρήστης $user Υπάρχει" fi
Αυτό συμβαίνει μετά την εκτέλεση αυτού του σεναρίου.


Αναζήτηση χρήστη

Εδώ χρησιμοποιήσαμε την εντολή grep για να βρούμε τον χρήστη στο αρχείο /etc/passwd. Εάν η εντολή grep δεν σας είναι γνωστή, μπορείτε να βρείτε την περιγραφή της εδώ.

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

Η κατασκευή ελέγχου αν-τότε-άλλο

Για να μπορεί το πρόγραμμα να αναφέρει τόσο τα αποτελέσματα μιας επιτυχημένης αναζήτησης όσο και μιας αποτυχίας, θα χρησιμοποιήσουμε την κατασκευή εάν-τότε-άλλο. Δείτε πώς έχει ρυθμιστεί:

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

Ας γράψουμε το ακόλουθο σενάριο:

#!/bin/bash user=anotherUser if grep $user /etc/passwd τότε echo "Ο χρήστης $user Υπάρχει" αλλιώς echo "Ο χρήστης $user δεν υπάρχει" fi
Η εκτέλεσή του προχώρησε στον άλλο κλάδο.


Εκτέλεση ενός σεναρίου με μια κατασκευή εάν-τότε-άλλο

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

Αν η εντολή1 τότε δίνει εντολή elif command2 τότε δίνει εντολή fi
Εάν η πρώτη εντολή επιστρέψει μηδέν, υποδεικνύοντας επιτυχία, θα εκτελεστούν οι εντολές στο πρώτο και στη συνέχεια μπλοκ, διαφορετικά, εάν η πρώτη συνθήκη είναι ψευδής και εάν η δεύτερη εντολή επιστρέψει μηδέν, θα εκτελεστεί το δεύτερο μπλοκ κώδικα.

#!/bin/bash user=anotherUser if grep $user /etc/passwd τότε echo "Ο χρήστης $user Υπάρχει" elif ls /home και μετά echo "Ο χρήστης δεν υπάρχει αλλά ούτως ή άλλως υπάρχει ένας κατάλογος κάτω από το /home" fi
Σε ένα τέτοιο σενάριο, μπορείτε, για παράδειγμα, να δημιουργήσετε έναν νέο χρήστη χρησιμοποιώντας την εντολή useradd εάν η αναζήτηση δεν εμφανίσει αποτελέσματα ή να κάνετε κάτι άλλο χρήσιμο.

Σύγκριση αριθμών

Στα σενάρια, μπορείτε να συγκρίνετε αριθμητικές τιμές. Παρακάτω είναι μια λίστα με σχετικές εντολές.
n1 -eq n2 Επιστρέφει true αν το n1 είναι ίσο με n2 .
n1 -ge n2 Επιστρέφει true εάν το n1 είναι μεγαλύτερο ή ίσο με n2.
n1 -gt n2 Επιστρέφει true αν το n1 είναι μεγαλύτερο από n2 .
n1 -le n2 Επιστρέφει true εάν το n1 είναι μικρότερο ή ίσο με n2.
n1 -lt n2 Επιστρέφει true εάν το n1 είναι μικρότερο από n2.
n1 -ne n2 Επιστρέφει true εάν το n1 δεν είναι ίσο με n2.

Για παράδειγμα, ας δοκιμάσουμε έναν από τους τελεστές σύγκρισης. Σημειώστε ότι η έκφραση περικλείεται σε αγκύλες.

#!/bin/bash val1=6 εάν [ $val1 -gt 5 ] τότε echo "Η τιμή δοκιμής $val1 είναι μεγαλύτερη από 5" αλλιώς echo "Η τιμή δοκιμής $val1 δεν είναι μεγαλύτερη από 5" fi
Εδώ είναι τι θα δώσει αυτή η εντολή.


Σύγκριση αριθμών σε σενάρια

Η τιμή της μεταβλητής val1 είναι μεγαλύτερη από 5, με αποτέλεσμα να εκτελείται ο τότε κλάδος του τελεστή σύγκρισης και να εμφανίζεται το αντίστοιχο μήνυμα στην κονσόλα.

Σύγκριση χορδών

Τα σενάρια μπορούν επίσης να συγκρίνουν τιμές συμβολοσειρών. Οι τελεστές σύγκρισης φαίνονται αρκετά απλοί, αλλά οι τελεστές σύγκρισης συμβολοσειρών έχουν ορισμένες ιδιαιτερότητες, τις οποίες θα θίξουμε παρακάτω. Ακολουθεί μια λίστα με χειριστές.
str1 = str2 Δοκιμάζει τις συμβολοσειρές για ισότητα, επιστρέφει true εάν οι συμβολοσειρές είναι ίδιες.
s tr1 != str2 Επιστρέφει true αν οι συμβολοσειρές δεν είναι ίδιες.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1 > str2 Επιστρέφει true εάν το str1 είναι μεγαλύτερο από το str2.
-n str1 Επιστρέφει true αν το μήκος του str1 είναι μεγαλύτερο από μηδέν.
-z str1 Επιστρέφει true αν το μήκος του str1 είναι μηδέν.

Ακολουθεί ένα παράδειγμα σύγκρισης συμβολοσειρών σε ένα σενάριο:

#!/bin/bash χρήστης ="likegeeks" εάν [$user = $USER] τότε επαναλάβετε "Ο χρήστης $user είναι ο τρέχων συνδεδεμένος χρήστης" fi
Ως αποτέλεσμα της εκτέλεσης του σεναρίου, έχουμε τα εξής.


Σύγκριση συμβολοσειρών σε σενάρια

Εδώ είναι ένα χαρακτηριστικό της σύγκρισης χορδών που αξίζει να αναφερθεί. Δηλαδή, οι τελεστές ">" και "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>' ως εντολή ανακατεύθυνσης εξόδου.

Δείτε πώς φαίνεται στον κώδικα η εργασία με αυτούς τους τελεστές:

#!/bin/bash val1=text val2="άλλο κείμενο" εάν [ $val1 \>
Εδώ είναι τα αποτελέσματα του σεναρίου.


Σύγκριση χορδών, προειδοποίηση πεταμένη

Σημειώστε ότι το σενάριο, αν και εκτελείται, δίνει μια προειδοποίηση:

./myscript: γραμμή 5: [: πάρα πολλά επιχειρήματα
Για να απαλλαγείτε από αυτήν την προειδοποίηση, περικλείστε το $val2 σε διπλά εισαγωγικά:

#!/bin/bash val1=text val2="άλλο κείμενο" εάν [ $val1 \> "$val2" ] τότε ηχώ "$val1 είναι μεγαλύτερο από $val2" αλλιώς echo "$val1 είναι μικρότερο από $val2" fi
Τώρα όλα λειτουργούν όπως πρέπει.


Σύγκριση χορδών

Ένα άλλο χαρακτηριστικό των ">" και "<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks likegeeks
Αποθηκεύστε το με το όνομα myfile και, στη συνέχεια, εκτελέστε την ακόλουθη εντολή στο τερματικό:

Ταξινόμηση του αρχείου μου
Θα ταξινομήσει τις γραμμές από το αρχείο ως εξής:

Likegeeks Likegeeks
Η εντολή sort, από προεπιλογή, ταξινομεί τις συμβολοσειρές με αύξουσα σειρά, δηλαδή το πεζό γράμμα στο παράδειγμά μας είναι μικρότερο από το κεφαλαίο. Τώρα ας ετοιμάσουμε ένα σενάριο που θα συγκρίνει τις ίδιες συμβολοσειρές:

#!/bin/bash val1=Likegeeks val2=likegeeks αν [ $val1 \> $val2 ] τότε ηχώ "$val1 είναι μεγαλύτερο από $val2" αλλιώς echo "$val1 είναι μικρότερο από $val2" fi
Εάν το εκτελέσετε, αποδεικνύεται ότι ισχύει το αντίθετο - το πεζό γράμμα είναι πλέον μεγαλύτερο από το κεφαλαίο.


εντολή ταξινόμησης και σύγκριση συμβολοσειρών σε αρχείο σεναρίου

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

Η εντολή ταξινόμησης, με τη σειρά της, χρησιμοποιεί τη σειρά ταξινόμησης που καθορίζεται στις ρυθμίσεις γλώσσας συστήματος.

Έλεγχοι αρχείων

Ίσως οι παρακάτω εντολές χρησιμοποιούνται πιο συχνά σε σενάρια bash. Σας επιτρέπουν να ελέγχετε διάφορες συνθήκες σχετικά με τα αρχεία. Εδώ είναι μια λίστα με αυτές τις εντολές.
-d file Ελέγχει εάν το αρχείο υπάρχει και είναι κατάλογος.
-e file Ελέγχει εάν υπάρχει αρχείο.
-f αρχείο Ελέγχει εάν υπάρχει αρχείο και είναι αρχείο.
Αρχείο -r Ελέγχει εάν το αρχείο υπάρχει και είναι αναγνώσιμο.
Αρχείο -s Ελέγχει εάν το αρχείο υπάρχει και δεν είναι κενό.
-w αρχείο Ελέγχει εάν το αρχείο υπάρχει και είναι εγγράψιμο.
-x file Ελέγχει εάν το αρχείο υπάρχει και είναι εκτελέσιμο.
file1 -nt file2 Ελέγχει εάν το αρχείο1 είναι νεότερο από το file2.
file1 -ot file2 Ελέγχει εάν το αρχείο1 είναι παλαιότερο από το αρχείο2.
-O αρχείο Ελέγχει εάν το αρχείο υπάρχει και ανήκει στον τρέχοντα χρήστη.
-Αρχείο G Ελέγχει εάν το αρχείο υπάρχει και αν το αναγνωριστικό ομάδας του ταιριάζει με το αναγνωριστικό ομάδας του τρέχοντος χρήστη.

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

Ας δοκιμάσουμε μια από τις εντολές στην πράξη:

#!/bin/bash mydir=/home/likegeeks if [ -d $mydir ] τότε echo "Ο κατάλογος $mydir υπάρχει" cd $ mydir ls else echo "Ο κατάλογος $mydir δεν υπάρχει" fi
Αυτό το σενάριο, για έναν υπάρχοντα κατάλογο, θα εμφανίσει τα περιεχόμενά του.


Καταχώριση των περιεχομένων ενός καταλόγου

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

Αποτελέσματα

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

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

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

Ένα σενάριο, ή όπως ονομάζεται επίσης, ένα σενάριο, είναι μια ακολουθία εντολών που διαβάζονται και εκτελούνται με τη σειρά τους από ένα πρόγραμμα διερμηνέα, στην περίπτωσή μας είναι ένα πρόγραμμα γραμμής εντολών - bash.

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

Το απλούστερο παράδειγμα σεναρίου για κέλυφος εντολώνΚτυπώ δυνατά:

!/bin/bash
ηχώ "Γεια σου κόσμο"

Το βοηθητικό πρόγραμμα echo εκτυπώνει τη συμβολοσειρά που του μεταβιβάστηκε ως παράμετρος στην οθόνη. Η πρώτη γραμμή είναι ειδική, καθορίζει το πρόγραμμα που θα εκτελέσει τις εντολές. Σε γενικές γραμμές, μπορούμε να δημιουργήσουμε ένα σενάριο σε οποιαδήποτε άλλη γλώσσα προγραμματισμού και να καθορίσουμε τον επιθυμητό διερμηνέα, για παράδειγμα, στην python:

!/usr/bin/env python
εκτύπωση ("Γεια σου κόσμο")

Ή σε PHP:

!/usr/bin/env php
ηχώ "Γεια σου κόσμο"?

Στην πρώτη περίπτωση, δείξαμε απευθείας το πρόγραμμα που θα εκτελέσει τις εντολές, στις δύο επόμενες, δεν γνωρίζουμε την ακριβή διεύθυνση του προγράμματος, οπότε ζητάμε από το env utility να το βρει με το όνομα και να το εκτελέσει. Αυτή η προσέγγιση χρησιμοποιείται σε πολλά σενάρια. Αλλά δεν είναι μόνο αυτό. ΣΕ Σύστημα Linux, ώστε το σύστημα να μπορεί να εκτελέσει το σενάριο, πρέπει να ορίσετε την εκτελέσιμη σημαία στο αρχείο με αυτό.

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

Τρέχω:

chmod ugo+x script_file

Τώρα τρέχουμε το μικρό μας πρώτο πρόγραμμα:

./script_file

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

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

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

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

Για παράδειγμα, ας δηλώσουμε μια μεταβλητή συμβολοσειράς:

string="Γεια σου κόσμο"

Η αξία της συμβολοσειράς μας βρίσκεται σε εισαγωγικά. Αλλά στην πραγματικότητα, τα εισαγωγικά δεν χρειάζονται πάντα. Εδώ διατηρείται η κύρια αρχή του bash - ο χώρος είναι ΕΙΔΙΚΟΣ ΧΑΡΑΚΤΗΡΑΣ, οριοθέτης, οπότε αν δεν χρησιμοποιείτε εισαγωγικά, ο κόσμος θα θεωρείται ήδη ξεχωριστή εντολή, για τον ίδιο λόγο δεν βάζουμε κενά πριν και μετά το σύμβολο ίσου.

Το σύμβολο $ χρησιμοποιείται για την εμφάνιση της τιμής μιας μεταβλητής. Για παράδειγμα:

Ας τροποποιήσουμε το σενάριό μας:

!/bin/bash
string1="γεια"
string2=κόσμος
string=$string1$string2
echo $string

Και ελέγχουμε:

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

!/bin/bash
string1="γεια"
string2=κόσμος
string=$string1$string2\ και\ εγώ
string3=$string1$string2" και εγώ"
echo $string3

Ελέγχουμε:

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

Μεταβλητές και έξοδος εντολών

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

$(εντολή )

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

Καταλαβαίνεις? Ας γράψουμε ένα σενάριο όπου θα εμφανίζεται το hello world και η ημερομηνία:

string1="γεια σου κόσμε"
string2=$(ημερομηνία)

string=$string1$string2

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

Παράμετροι σεναρίου

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

Η μεταβλητή με το όνομα 1 περιέχει την τιμή της πρώτης παραμέτρου, της μεταβλητής 2, της δεύτερης και ούτω καθεξής. Αυτό το σενάριο bash θα δώσει την τιμή της πρώτης παραμέτρου:

!/bin/bash
ηχώ $1

Κατασκευές ελέγχου σε σενάρια

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

Στο Bash, υπάρχει μια εντολή για τον έλεγχο των συνθηκών. Η σύνταξή της είναι η εξής:

εάν εντολή_συνθήκη
έπειτα
εντολή
αλλού
εντολή
fi

Αυτή η εντολή ελέγχει τον κωδικό εξόδου της εντολής συνθήκης και εάν το 0 (επιτυχία) τότε εκτελεί την εντολή ή πολλές εντολές μετά τη λέξη, τότε, εάν ο κωδικός εξόδου είναι 1, εκτελείται το μπλοκ else, το fi σημαίνει την ολοκλήρωση του μπλοκ του εντολές.

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

[[ παράμετρος 1 παράμετρος χειριστή 2 ]]

Για σύγκριση, χρησιμοποιούμε τους ήδη γνωστούς τελεστές<,>,=,!= και ούτω καθεξής Εάν η έκφραση είναι αληθής, η εντολή θα επιστρέψει 0, αν όχι - 1. Μπορείτε να δοκιμάσετε λίγο τη συμπεριφορά της στο τερματικό. Ο κωδικός επιστροφής της τελευταίας εντολής αποθηκεύεται στη μεταβλητή $?:

Τώρα, συνδυάζοντας όλα αυτά, παίρνουμε ένα σενάριο με μια έκφραση υπό όρους:

!/bin/bash
εάν [[ $1 > 2 ]]
έπειτα
ηχώ $1" είναι μεγαλύτερη από 2"
αλλού
ηχώ $1" είναι μικρότερη από 2 ή 2"
fi

Φυσικά, αυτός ο σχεδιασμός έχει πιο ισχυρά χαρακτηριστικά, αλλά είναι πολύ περίπλοκο για να τα καλύψουμε σε αυτό το άρθρο. Ίσως το γράψω αργότερα. Προς το παρόν, ας περάσουμε στους κύκλους.

Βρόχοι σε σενάρια

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

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

για μεταβλητή στη λίστα
κάνω
εντολή
Ολοκληρώθηκε

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

Για παράδειγμα, ας επαναλάβουμε πάνω από πέντε ψηφία:

για ευρετήριο σε 1 2 3 4 5
κάνω
echo $index
Ολοκληρώθηκε

Ή μπορείτε να παραθέσετε όλα τα αρχεία στον τρέχοντα κατάλογο:

για αρχείο σε $(ls -l); κάντε echo "$file"? Ολοκληρώθηκε

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

Ο δεύτερος βρόχος που θα εξετάσουμε είναι ο βρόχος while, ο οποίος εκτελείται ενώ η εντολή συνθήκης επιστρέφει τον κωδικό 0, επιτυχία. Σκεφτείτε τη σύνταξη:

ενώ συνθήκη εντολής
κάνω
εντολή
Ολοκληρώθηκε

Εξετάστε ένα παράδειγμα:

!/bin/bash
ευρετήριο=1
ενώ [[ $index< 5 ]]
κάνω
echo $index
ας "index=index+1"
Ολοκληρώθηκε

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

Θα ήθελα να σημειώσω κάτι άλλο. Κατασκευές όπως while, for, if έχουν σχεδιαστεί για να γράφονται σε πολλές γραμμές και αν προσπαθήσετε να τις γράψετε σε μία γραμμή, θα λάβετε ένα σφάλμα. Ωστόσο, είναι δυνατόν, για αυτό, όπου θα πρέπει να υπάρχει διάλειμμα γραμμής, βάλτε ένα ερωτηματικό ";". Για παράδειγμα, ο προηγούμενος βρόχος θα μπορούσε να είχε εκτελεστεί ως μία γραμμή:

ευρετήριο=1; ενώ [[ $index< 5 ]]; do echo $index; let "index=index+1"; done;

Όλα είναι πολύ απλά, προσπάθησα να μην περιπλέκω το άρθρο με πρόσθετους όρους και δυνατότητες bash, μόνο τα πιο βασικά. Σε ορισμένες περιπτώσεις, μπορεί να χρειαστεί να δημιουργήσετε ένα gui για ένα σενάριο bash και, στη συνέχεια, μπορείτε να χρησιμοποιήσετε προγράμματα όπως το zenity ή το kdialog, με τα οποία είναι πολύ βολικό να εμφανίζετε μηνύματα στον χρήστη και ακόμη και να του ζητάτε πληροφορίες.

συμπεράσματα

Τώρα καταλαβαίνετε τα βασικά του σεναρίου στο linux και μπορείτε να γράψετε το σενάριο που χρειάζεστε, για παράδειγμα, για Κρατήστε αντίγραφο. Προσπάθησα να δω τα σενάρια bash από την αρχή. Επομένως, δεν έχουν ληφθεί υπόψη όλες οι πτυχές. Ίσως θα επιστρέψουμε σε αυτό το θέμα σε ένα από τα ακόλουθα άρθρα.

Μάλλον όλοι το γνωρίζουν Κοχύλια Bashυπάρχουν ενσωματωμένες εντολές που δεν βρίσκονται στους φακέλους /bin ή /usr/bin. Είναι ενσωματωμένα στο κέλυφος και λειτουργούν ως λειτουργίες. Σε ένα από τα προηγούμενα άρθρα, εξετάσαμε. Συζητήσαμε σχεδόν τα πάντα εκεί, πώς πρέπει να φαίνονται τα σενάρια, τη χρήση συνθηκών, βρόχων, μεταβλητών, αλλά δεν σταματήσαμε στις συναρτήσεις.

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

Πρώτα πρέπει να καταλάβουμε τι είναι μια συνάρτηση στο περιβάλλον μας. Μια συνάρτηση είναι ένα σύνολο εντολών, ενωμένων με ένα όνομα, που εκτελούν μια συγκεκριμένη εργασία. Η συνάρτηση ονομάζεται με το όνομά της, μπορεί να λάβει παραμέτρους και να επιστρέψει το αποτέλεσμα της εργασίας. Εν ολίγοις, οι συναρτήσεις Bash λειτουργούν όπως και σε άλλες γλώσσες προγραμματισμού.

Η σύνταξη για τη δημιουργία μιας συνάρτησης είναι πολύ απλή:

function_name() ( λίστα εντολών )

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

απλή λειτουργία

Ας γράψουμε μια μικρή συνάρτηση που θα εκτυπώσει μια συμβολοσειρά στην οθόνη:

$ vi συνάρτηση.sh

#!/bin/bash
printstr()(
ηχώ "γεια σου κόσμε"
}
printstr

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

συνάρτηση chmod u+x.sh

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

Επιχειρήματα συνάρτησης

Τα ορίσματα συνάρτησης πρέπει να μεταβιβάζονται κατά την κλήση και διαβάζονται με τον ίδιο τρόπο όπως τα ορίσματα σεναρίου. Η σύνταξη για την κλήση μιας συνάρτησης με παραμέτρους bash είναι:

όνομα_λειτουργίας επιχείρημα1 επιχείρημα2 ... επιχείρημαΝ

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

!/bin/bash
printstr()(
ηχώ $1
}
printstr "Γεια σου κόσμο"

Μπορείτε να έχετε πολλές επιλογές:

!/bin/bash
printstr()(
ηχώ $1
ηχώ $2
ηχώ $3
ηχώ $5
}
printstr "arg1" "arg2" "arg3" "arg4" "arg5"

Υπάρχει ένας άλλος τρόπος εξαγωγής ορισμάτων, όπως στο C, χρησιμοποιώντας τη στοίβα. Λαμβάνουμε το πρώτο όρισμα, μετά προωθούμε τον δείκτη στοίβας ορισμάτων κατά ένα και ανακτούμε ξανά το πρώτο όρισμα. Και τα λοιπά:

!/bin/bash
printstr()(
ηχώ $1
βάρδια
ηχώ $1
βάρδια
ηχώ $1
βάρδια
ηχώ $1
}
printstr "arg1" "arg2" "arg3" "arg4"

Επιστρέφοντας το αποτέλεσμα μιας συνάρτησης

Μπορείτε όχι μόνο να χρησιμοποιήσετε συναρτήσεις με παραμέτρους bash, αλλά και να λάβετε το αποτέλεσμα της εργασίας από αυτό. Η εντολή επιστροφής χρησιμοποιείται για αυτό. Τερματίζει τη λειτουργία και επιστρέφει αριθμητική αξίακωδικός επιστροφής. Μπορεί να είναι από 0 έως 255:

!/bin/bash
printstr()(
επιστροφή 134;
}
printstr
ηχώ $;

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

!/bin/bash
printstr()(
ηχώ "δοκιμή"
}
VAR=$(printstr)
echo $VAR

Λειτουργίες εξαγωγής

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

!/bin/bash
printstr()(
ηχώ "γεια σου κόσμε"
}
δηλώνω -x -f printstr

Στη συνέχεια, εκτελέστε το σενάριο με την εντολή πηγής:

λειτουργία πηγής.sh
$printstr

αναδρομή

Μπορείτε να καλέσετε μια συνάρτηση από μέσα της για να κάνετε την αναδρομή:

!/bin/bash
printstr()(
ηχώ "γεια σου κόσμε"
printstr
}
printstr

Μπορείτε να πειραματιστείτε με τη χρήση της αναδρομής, μπορεί να είναι χρήσιμη σε πολλές περιπτώσεις, απλά θυμηθείτε να κάνετε την πρώτη κλήση συνάρτησης Bash.

Τοπικές μεταβλητές σε μια συνάρτηση

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

!/bin/bash
printstr()(
τοπικό VAR=$1
ηχώ $(var)
}
printstr "Hello World"

Βιβλιοθήκες λειτουργιών

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

test1()(
echo "Hello World from 1"?
}
test2()(
echo "Hello World from 2"?
}
test3()(
echo "Hello World from 3"?
}

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

!/bin/bash
πηγή lib.sh
δοκιμή 1
τεστ2
δοκιμή 3

συμπεράσματα

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

Συνεχίζοντας το θέμα:
Λύσεις

Ο παρακάτω πίνακας παρέχει χρήσιμες πληροφορίες σχετικά με την επέκταση αρχείου .deb. Απαντά σε ερωτήσεις όπως: Τι είναι ένα αρχείο .deb; Τι λογισμικό χρειάζομαι για να ανοίξω...

Νέα άρθρα
/
Δημοφιλής