Linux bash skriptləri. Bash -da skriptlər yazmaq. Şərtlər. Çoxlu seçim

Bu gün bash skriptləri haqqında danışacağıq. Bunlar bash qabığı üçün yazılmış əmr satırı skriptləridir. Zsh, tcsh, ksh kimi başqa qabıqlar da var, ancaq bash üzərində dayanacağıq. Bu material hər kəs üçün nəzərdə tutulmuşdur, yeganə şərt Linux əmr satırında işləmək bacarığıdır.



Komanda satırı skriptləri, klaviaturadan daxil edilə bilən, fayllara yığılmış və ümumi bir məqsədlə birləşdirilə bilən eyni əmrlərin toplusudur. Bu halda, komandaların işlərinin nəticələri ya müstəqil dəyər ola bilər, ya da digər komandalar üçün giriş məlumatı olaraq xidmət edə bilər. Skript, tez -tez yerinə yetirilən hərəkətləri avtomatlaşdırmaq üçün güclü bir yoldur.

Beləliklə, əmr satırından bəhs etsək, nöqtəli vergüllə ayrılaraq bir anda bir neçə əmri yerinə yetirməyə imkan verir:

Pwd; Mən kiməm
Əslində, bunu terminalınızda sınamısınızsa, iki əmri ehtiva edən ilk bash skriptiniz artıq yazılmışdır. Bu kimi işləyir. Əvvəlcə pwd əmri cari iş qovluğu haqqında məlumatları, sonra whoami əmri daxil olduğunuz istifadəçi haqqında məlumatları göstərir.

Bu yanaşmadan istifadə edərək bir sətirdə istədiyiniz qədər komanda birləşdirə bilərsiniz, məhdudiyyət yalnız proqrama ötürülə bilən maksimum arqument sayındadır. Aşağıdakı əmri istifadə edərək bu məhdudiyyəti təyin edə bilərsiniz:

Getconf ARG_MAX
Komanda xətti əla bir vasitədir, ancaq hər dəfə ehtiyacınız olduqda əmrləri daxil etməlisiniz. Bir fayla bir dəstə əmr yazsanız və onları icra etmək üçün həmin faylı çağırsanız nə olar? Əslində bəhs etdiyimiz fayla əmr satırı skripti deyilir.

Bash skriptləri necə işləyir

Toxunma əmrindən istifadə edərək boş bir fayl yaradın. Birinci sətirdə hansı qabığı istifadə edəcəyimizi göstərməliyik. Bash ilə maraqlanırıq, buna görə faylın ilk sətri belə olacaq:

#! / bin / bash
Bu faylın digər sətirlərində, hash işarəsi qabığın işlənmədiyi şərhləri ifadə etmək üçün istifadə olunur. Bununla birlikdə, ilk sətir xüsusi bir haldır, burada bir hash işarəsindən sonra bir nida işarəsi (bu ardıcıllığa shebang deyilir) və bash yolu sistemə skriptin bash üçün yazıldığını göstərir.

Shell əmrləri xətt ötürmələri ilə, şərhlər hash işarələri ilə ayrılır. Görünüşü belədir:

#! / bin / bash # Bu pwd whoami şərhidir
Burada, həm də əmr satırında, bir sətirdə nöqtəli vergüllə ayrılmış əmrlər yaza bilərsiniz. Bununla birlikdə, əmrləri ayrı sətirlərə yazmaq faylı oxumağı asanlaşdırır. Hər halda, qabıq onları emal edəcək.

Skript faylı icazələrinin qurulması

Faylı myscript adı ilə qeyd edin və demək olar ki, bash skriptini hazırlayırsınız. İndi qalan yalnız bu faylı icra edilə bilən etməkdir, əks halda onu işə salmağa icazə verilərkən İcazə vermə xətası ilə qarşılaşacaqsınız.


Səhv konfiqurasiya edilmiş icazələri olan bir skript faylını işə salmağa cəhd

Faylın icra olunmasını təmin edək:

Chmod + x ./script
İndi onu yerinə yetirməyə çalışaq:

./script
İcazələri təyin etdikdən sonra hər şey lazım olduğu kimi işləyir.


Bash skript uğurla işləyir

Mesajlar göstərilir

Echo əmri Linux konsoluna mətn çıxarmaq üçün istifadə olunur. Gəlin bu faktın biliklərindən faydalanaq və artıq daxil olan əmrlərlə göstərilən məlumatlara şərhlər əlavə edərək skriptimizi düzəldək:

#! / bin / bash # şərhimiz buradadır echo "Mövcud qovluq:" pwd echo "Daxil olan istifadəçi:" whoami
Yenilənmiş skriptin işə salınmasından sonra belə olur.


Bir skriptdən gələn mesajlar göstərilir

İndi echo əmrindən istifadə edərək izahlı qeydlər çap edə bilərik. Linux alətlərindən istifadə edərək bir faylın necə düzəldiləcəyini bilmirsinizsə və ya daha əvvəl echo əmrini görməmisinizsə, bu mənbəyə baxın.

Dəyişənlərdən istifadə

Dəyişənlər məlumatı skript sənədində saxlamağa imkan verir, məsələn - digər əmrlərin istifadəsi üçün əmrlərin nəticələri.

İşlərinin nəticələrini saxlamadan fərdi əmrləri yerinə yetirməkdə heç bir günah yoxdur, amma bu yanaşmanın imkanları çox məhduddur.

Bash skriptlərində istifadə edilə bilən iki növ dəyişən var:

  • Ətraf Mühit Dəyişənləri
  • İstifadəçi dəyişənləri

Ətraf Mühit Dəyişənləri

Bəzən shell əmrləri bəzi sistem məlumatları ilə işləməlidir. Məsələn, cari istifadəçinin ev qovluğunu necə göstərmək olar:

#! / bin / bash # istifadəçi evinin əks -sədası "Mövcud istifadəçinin evi: $ HOME"
Diqqət yetirin ki, $ HOME sistem dəyişənini ikiqat qiymətlərlə istifadə edə bilərik, bu sistemin onu tanımasına mane olmayacaq. Yuxarıdakı skriptdən istifadə etsəniz belə olur.


Bir skriptdə bir mühit dəyişənindən istifadə

Dollar işarəsini ekranda göstərmək istəyirsinizsə nə etməli? Gəlin bunu sınayaq:

Echo "Cibimdə 1 dollar var"
Sistem, alınmış sətirdə dollar işarəsini algılar və bir dəyişənə istinad etdiyimizi düşünür. Skript, $ 1 təyin olunmayan dəyişənin dəyərini göstərməyə çalışacaq. İstədiyimiz bu deyil. Nə etməli?

Dollar işarəsindən əvvəl geriyə doğru qaçma xarakteri bu vəziyyətdə kömək edə bilər:

Yankı "Cibimdə \ $ 1 var"
Ssenari indi tam olaraq gözləniləni çıxaracaq.


Dollar işarəsi çıxarmaq üçün bir qaçış ardıcıllığından istifadə

İstifadəçi dəyişənləri

Ətraf mühit dəyişənlərinə əlavə olaraq, bash skriptləri skriptdə öz dəyişənlərinizi təyin etməyə və istifadə etməyə imkan verir. Bu dəyişənlər, skriptin icra edilməsini başa çatdırana qədər öz dəyərini saxlayır.

Sistem dəyişənlərində olduğu kimi, istifadəçi dəyişənlərinə dollar işarəsi ilə daxil olmaq olar:
TNW-CUS-FMP-xidmətlərimizə 10% endirim üçün promosyon kodu, 7 gün ərzində aktivləşdirilə bilər.
#! / bin / bash # test dəyişənləri grade = 5 nəfər = "Adam" echo "$ person yaxşı oğlandır, $ sinifindədir"
Belə bir skript işlədikdən sonra belə olur.


Bir skriptdə xüsusi dəyişənlər

Əmr dəyişdirmə

Baş skriptlərin ən faydalı xüsusiyyətlərindən biri, əmrlərin çıxışından məlumat çıxarmaq və dəyişənlərə təyin etmək qabiliyyətidir ki, bu da skript faylının istənilən yerində istifadə olunmasına imkan verir.

Bu iki şəkildə edilə bilər.

  • Arxa vuruşla ""
  • $ () İstifadə edərək
Birinci yanaşmadan istifadə edərək, arxa vuruş yerinə tək bir sitat istifadə etməmək üçün diqqətli olun. Komanda iki belə nişana əlavə edilməlidir:

Mydir = `pwd`
İkinci yanaşmada eyni şey belə yazılır:

Mydir = $ (pwd)
Və ssenari sonda belə görünə bilər:

#! / bin / bash mydir = $ (pwd) echo $ mydir
Əməliyyat zamanı pwd əmrinin çıxışı, echo əmrindən istifadə edərək konsola gedəcək olan mydir dəyişənində saxlanılacaq.


Bir əmrin nəticələrini dəyişəndə ​​saxlayan bir skript

Riyazi əməliyyatlar

Bir skript faylında riyazi əməliyyatlar aparmaq üçün $ ((a + b)) kimi bir quruluş istifadə edə bilərsiniz:

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


Bir skriptdə riyazi əməliyyatlar

Əgər-sonra nəzarət quruluşu

Bəzi ssenarilər əmr icra axınının nəzarətini tələb edir. Məsələn, bir dəyər beşdən çox olarsa, bir hərəkət etməlisiniz, əks halda - başqa. Bu, bir çox hallarda tətbiq olunur və əgər idarəetmə quruluşu burada bizə kömək edəcək. Ən sadə formada belə görünür:

Əgər əmr verilirsə, fi -ə əmr edin
Və burada işləyən bir nümunə var:

#! / bin / bash, pwd sonra "işləyir" fi -ni əks etdirir
Bu halda, əgər pwd əmri uğurla tamamlanarsa, konsolda "işləyir" yazısı görünəcək.

Gəlin biliklərimizdən istifadə edək və daha mürəkkəb bir ssenari yazaq. Tutaq ki, / etc / passwd -də müəyyən bir istifadəçi tapmalısınız və tapa bilsəniz, mövcud olduğunu bildirin.

#! / bin / bash user = likegeeks əgər grep $ user / etc / passwd sonra "İstifadəçi $ istifadəçi var" fi -ni əks etdirir
Bu skript işlədikdən sonra belə olur.


İstifadəçi axtarın

Burada / etc / passwd faylında istifadəçini tapmaq üçün grep əmrindən istifadə etdik. Grep əmri ilə tanış deyilsinizsə, onun təsvirini tapa bilərsiniz.

Bu nümunədə, bir istifadəçi tapılarsa, skript uyğun bir mesaj göstərəcəkdir. İstifadəçi tapılmasa nə olar? Bu halda, skript bizə heç nə demədən sadəcə icraatına son qoyacaq. İstəyirəm ki, bizə də bu barədə məlumat versin, buna görə də kodu təkmilləşdirəcəyik.

If-then-else nəzarət quruluşu

Proqramın həm uğurlu bir axtarışın nəticələrini, həm də uğursuzluğunu bildirə bilməsi üçün if-then-else quruluşundan istifadə edəcəyik. İşdə necə işləyir:

Əgər əmr varsa, başqa əmrlər fi əmrlərini əmr edir
İlk əmr sıfır qaytarırsa, bu onun uğurlu icrası deməkdir, şərt doğru olacaq və icra başqa filialı izləməyəcək. Əks təqdirdə, sıfırdan başqa bir şey geri qaytarılırsa, bu uğursuzluq və ya yanlış nəticə deməkdir, başqasından sonra əmrlər yerinə yetiriləcəkdir.

Gəlin belə bir ssenari yazaq:

#! / bin / bash user = anotherUser, əgər grep $ user / etc / passwd sonra "İstifadəçi $ istifadəçi var" əks -sədası verilirsə "İstifadəçi $ istifadəçi yoxdur" fi
Onun icrası digər filial boyunca getdi.


If-then-else konstruksiyası olan bir skript işlətmək

Yaxşı, davam etməyə davam edək və daha çətin şərtlər barədə özümüzdən soruşaq. Birdən çox vəziyyəti yoxlamaq lazımdırsa nə etməli? Məsələn, istədiyiniz istifadəçi tapılarsa, bir mesaj göstərməlisiniz, əgər başqa bir şərt yerinə yetirilirsə - başqa bir mesaj və s. Belə bir vəziyyətdə iç içə olan şərtlər bizə kömək edəcək. Bu belə görünür:

Əgər əmr1 sonra elif əmrinə2, sonra fi əmrlərinə əmr edər
İlk əmr müvəffəqiyyətli icra olunduğunu göstərən sıfır qaytararsa, birinci blokdakı əmrlər yerinə yetiriləcək, əks halda birinci şərt yalan olarsa və ikinci əmr sıfır qaytararsa, ikinci kod bloku edam olunsun.

#! / bin / bash user = anotherUser, əgər grep $ user / etc / passwd sonra "İstifadəçi $ istifadəçi var" elif ls / home ilə əks -səda verirsə, sonra "İstifadəçi yoxdur, amma hər halda / home" altında bir kataloq var
Belə bir skriptdə, məsələn, axtarış heç bir nəticə vermədikdə və ya başqa faydalı bir şey etmədikdə useradd əmrindən istifadə edərək yeni bir istifadəçi yarada bilərsiniz.

Nömrələri müqayisə etmək

Sayı dəyərləri skriptlərdə müqayisə edilə bilər. Aşağıda müvafiq əmrlərin siyahısı verilmişdir.
n1 -eq n2 n1 n2 -ə bərabərdirsə doğru qaytarır.
n1 -ge n2 n1 n2 -dən böyük və ya ona bərabərdirsə, doğru qaytarır.
n1 -gt n2 n1 n2 -dən böyük olarsa doğru qaytarır.
n1 -le n2 n1 n2 -dən az və ya bərabərdirsə, doğru qaytarır.
n1 -lt n2 n1 n2 -dən az olarsa doğru qaytarır.
n1 -ne n2 n1 n2 -ə bərabər deyilsə doğru qaytarır.

Nümunə olaraq müqayisə operatorlarından birini sınayaq. Qeyd edək ki, ifadə kvadrat mötərizədədir.

#! / bin / bash val1 = 6, əgər [$ val1 -gt 5] sonra echo "$ val1 test dəyəri 5 -dən böyükdür" əks -sədası "$ val1 test dəyəri 5" -dən böyük deyil
Bu əmrin çıxış edəcəyi budur.


Skriptlərdə ədədlərin müqayisəsi

Val1 dəyişəninin dəyəri 5 -dən böyükdür, nəticədə müqayisə operatorunun o vaxtki qolu icra edilir və konsolda müvafiq mesaj göstərilir.

String müqayisəsi

Skriptlərdə simli dəyərləri müqayisə edə bilərsiniz. Müqayisə operatorları olduqca sadə görünür, lakin simli müqayisə əməliyyatlarının aşağıda toxunacağımız müəyyən özəllikləri var. İşdə operatorların siyahısı.
str1 = str2 Bərabərlik üçün simləri sınayır, sətirlər eyni olarsa doğru qaytarır.
s tr1! = str2 Sətirlər eyni olmadıqda doğru qaytarır.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1> str2 str1 str2 -dən böyükdürsə, doğru qaytarır.
-n str1 Str1 sıfırdan böyük olarsa, doğru qaytarır.
-z str1 Str1 uzunluğu sıfır olarsa doğru qaytarır.

Bir skriptdəki simləri müqayisə etmək nümunəsi:

#! / bin / bash user = "likegeeks" əgər [$ user = $ USER] sonra "İstifadəçi $ istifadəçi cari daxil olan istifadəçidir" fi əks -səda verir
Skriptin icrası nəticəsində aşağıdakıları əldə edirik.


Skriptlərdəki sətirlərin müqayisəsi

Budur, simli müqayisə xüsusiyyətlərindən biri. Yəni operatorlar ">" və "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>"Çıxış yönləndirmə əmri olaraq.

Bu operatorlarla işləmək kodda belə görünür:

#! / bin / bash val1 = text val2 = "başqa mətn" əgər [$ val1 \>
Budur ssenarinin nəticələri.


Sətirlərin müqayisəsi, xəbərdarlıq

Qeyd edək ki, skript icra olunsa da xəbərdarlıq yaradır:

./myscript: sətir 5: [: çox çox arqument
Bu xəbərdarlıqdan qurtulmaq üçün $ val2 -ni ikiqat tirnoq daxil edin:

#! / bin / bash val1 = text val2 = "başqa bir mətn" [$ val1 \> "$ val2"] olarsa echo "$ val1 $ val2 -dən böyükdür" əks halda echo "$ val1 $ val2 -dən azdır" fi
İndi hər şey lazım olduğu kimi işləyir.


String müqayisəsi

">" Və "operatorlarının başqa bir xüsusiyyəti<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Bəyənənlər bəyənirlər
Myfile adını verərək onu saxlayaq və sonra terminalda aşağıdakı əmri yerinə yetirək:

Faylımı sırala
Fayldakı sətirləri belə sıralayacaq:

Bəyənənlər Likegeeks
Sıralama əmri, standart olaraq xətləri artan qaydada sıralayır, yəni nümunəmizdəki kiçik hərf böyük hərfdən kiçikdir. İndi eyni sətirləri müqayisə edəcək bir skript hazırlayaq:

#! / bin / bash val1 = Likegeeks val2 = likegeeks əgər [$ val1 \> $ val2] sonra echo "$ val1 $ val2 -dən böyükdür" əks halda echo "$ val1 $ val2 -dən azdır" fi
İşləsəniz, bunun əksinin doğru olduğu ortaya çıxır - kiçik hərf indi böyük hərfdən daha böyükdür.


Bir skript faylında əmr və sətir müqayisəsini sıralayın

Müqayisə əmrlərində daha az böyük hərf var. Buradakı sətirlərin müqayisəsi ASCII xarakter kodlarını müqayisə etməklə aparılır, beləliklə sıralama qaydası xarakter kodlarından asılıdır.

Sıralama əmri, öz növbəsində, sistem dili parametrlərində göstərilən sıralama sırasından istifadə edir.

Fayl yoxlamaları

Aşağıdakı əmrlər, ehtimal ki, bash skriptlərində ən çox istifadə olunur. Fayllarla bağlı müxtəlif şərtləri yoxlamağa imkan verir. Budur bu əmrlərin siyahısı.
-d fayl Bir faylın olub olmadığını və bir kataloq olduğunu yoxlayır.
-e fayl Faylın olub olmadığını yoxlayır.
-f fayl Faylın olub olmadığını yoxlayır.
-r file Faylın olub olmadığını və oxunaqlı olduğunu yoxlayır.
-s faylı Faylın olub olmadığını və boş olmadığını yoxlayın.
-w fayl Faylın olub olmadığını və yazıla biləcəyini yoxlayır.
-x faylı Faylın mövcud olub olmadığını yoxlayır.
file1 -nt file2 file1 fayl2 -dən daha yeni olub olmadığını yoxlayır.
file1 -ot file2 file1 fayl2 -dən daha köhnə olub -olmadığını yoxlayır.
-O fayl Faylın mövcud olub olmadığını yoxlayır və cari istifadəçiyə məxsusdur.
-G faylı Faylın olub olmadığını və qrup identifikatorunun cari istifadəçinin qrup kimliyinə uyğun olub olmadığını yoxlayır.

Bu əmrləri, eləcə də bu gün müzakirə edilən bir çox əmrləri xatırlamaq asandır. Adları, müxtəlif sözlərdən qısaltmalar olmaqla, etdikləri yoxlamaları birbaşa göstərir.

Praktikada əmrlərdən birini sınayaq:

#! / bin / bash mydir = / home / likegeeks if [-d $ mydir] sonra "$ mydir qovluğu mövcuddur" əks-sədası cd $ mydir ls else echo "$ mydir qovluğu yoxdur" fi
Bu skript, mövcud bir kataloq üçün məzmununu göstərəcəkdir.


Bir kataloqun məzmununu çıxarmaq

Qalan əmrləri təkbaşına sınaya biləcəyinizə inanırıq, hamısı eyni şəkildə tətbiq olunur.

Nəticələr

Bu gün bash ssenariləri yazmağa necə başlayacağımızı və bəzi əsas şeyləri əhatə etdik. Əslində bash proqramlaşdırma mövzusu çox böyükdür. Bu məqalə 11 məqalədən ibarət böyük bir seriyanın birinci hissəsinin tərcüməsidir. Hal -hazırda davam etmək istəyirsinizsə - burada bu materialların orijinallarının siyahısı verilmişdir. Rahatlıq üçün bura yeni oxuduğunuz tərcümə daxildir.

Linux -da qrafik interfeysi nə qədər sadə olsa da və nə qədər çox funksiya olsa da, hələ də terminal vasitəsilə həll etmək üçün daha əlverişli vəzifələr var. Birincisi, daha sürətli olduğuna görə, ikincisi, bütün maşınların qrafik interfeysi yoxdur, məsələn, serverlərdə, hesablama mənbələrinə qənaət etmək üçün bütün hərəkətlər terminal vasitəsilə həyata keçirilir.

Artıq daha təcrübəli bir istifadəçisinizsə, ehtimal ki, tez -tez terminal vasitəsilə müxtəlif vəzifələri yerinə yetirirsiniz. Tez -tez bir neçə əmri növbə ilə yerinə yetirməli olduğunuz vəzifələr var, məsələn, sistemi yeniləmək üçün əvvəlcə depoları yeniləməlisiniz və yalnız sonra paketlərin yeni versiyalarını yükləməlisiniz. Bu yalnız bir nümunədir və belə bir çox hərəkət var, hətta bir nüsxə götürüb kopyalanan faylları uzaq bir serverə yükləyə bilərsiniz. Buna görə eyni əmrləri bir neçə dəfə yazmamaq üçün skriptlərdən istifadə edə bilərsiniz. Bu yazıda, Bash -da skriptlərin yazılmasına, əsas operatorlara və necə işlədiklərinə, belə desək, sıfırdan bash skriptlərinə baxacağıq.

Bir skript və ya adlandırıldığı kimi bir skript, bir tərcüməçi proqramı tərəfindən növbə ilə oxunan və icra edilən bir əmrlər ardıcıllığıdır, bizim vəziyyətimizdə bir əmr satırı proqramıdır - bash.

Bir skript, əl ilə daxil etməyə alışdığımız adi əmrləri və onları yerinə yetirəcək müəyyən proqramı sadalayan düz bir mətn sənədidir. Skriptin yerinə yetiriləcəyi yükləyici ətraf mühit dəyişənləri ilə necə işləməyi bilmir, buna görə də işə salınması üçün proqramın dəqiq yolunu keçmək lazımdır. Və sonra artıq skriptinizi bu proqrama köçürəcək və icra başlayacaq.

Bash shell skriptinin ən sadə nümunəsi:

! / bin / bash
echo "Salam dünya"

Echo yardım proqramı, ekrana parametr olaraq ötürülən sətri yazdırır. Birinci sətir özəldir, əmrləri yerinə yetirəcək proqramı göstərir. Ümumiyyətlə, hər hansı digər proqramlaşdırma dilində bir skript yarada və istədiyiniz tərcüməçini, məsələn, pythonda təyin edə bilərik:

! / usr / bin / env python
çap et ("Salam dünya")

Və ya PHP -də:

! / usr / bin / env php
echo "Salam dünya";

Birinci halda, əmrləri yerinə yetirəcək proqramı birbaşa göstərdik, sonrakı ikisində proqramın dəqiq ünvanını bilmirik, buna görə də env yardım proqramından adla tapmasını və işləməsini xahiş edirik. Bu yanaşma bir çox skriptdə istifadə olunur. Amma bu hamısı deyil. Linux sistemində, sistemin bir skript icra etməsi üçün onunla birlikdə faylda icra edilə bilən bayrağı təyin etməlisiniz.

Bu bayraq faylın özündə heç bir şeyi dəyişdirmir, yalnız sistemə bunun yalnız bir mətn faylı olmadığını, ancaq bir proqram olduğunu və bunun icra olunmasını, faylı açmasını, tərcüməçini tapıb icra etməsini bildirir. Tərcüməçi göstərilməyibsə, istifadəçinin tərcüməçisi standart olaraq istifadə olunacaq. Ancaq hamı bash istifadə etmədiyi üçün bunu açıq şəkildə göstərməlisiniz.

Qaçmaq:

chmod + x script_file

İndi kiçik ilk proqramımızı işə salırıq:

./script_file

Hər şey işləyir. Bir yeniləmə üçün kiçik bir skript yazmağı artıq bilirsiniz. Gördüyünüz kimi, skriptlər terminalda yerinə yetirilən eyni əmrləri ehtiva edir, yazmaq çox asandır. Ancaq indi işi bir az çətinləşdirəcəyik. Bir skript bir proqram olduğundan, özü qərar verməli, əmrlərin icrasının nəticələrini saxlamalı və döngələri icra etməlidir. Bütün bunlar Bash qabığı ilə edilir. Düzdür, burada hər şey daha mürəkkəbdir. Sadə başlayaq.

Skriptlərdə dəyişənlər

Bash -da skriptlər yazmaq nadir hallarda müvəqqəti məlumatları saxlamadan gedir, bu da dəyişənlər yaratmaq deməkdir. Heç bir proqramlaşdırma dili dəyişənlər olmadan tamamlanmır və nə bizim ibtidai qabıq dili.

Ətraf mühit dəyişənləri ilə əvvəllər qarşılaşmış ola bilərsiniz. Beləliklə, bunlar eyni dəyişənlərdir və eyni şəkildə işləyirlər.

Məsələn, dəyişən bir sətir elan edək:

string = "Salam dünya"

Stringimizin dəyəri göstərilmişdir. Ancaq əslində sitatlara həmişə ehtiyac yoxdur. Burada əsas bash prinsipi qorunur - boşluq xüsusi bir xarakterdir, ayırıcıdır, buna görə də sitatlardan istifadə etməsəniz, dünya artıq ayrı bir əmr olaraq qəbul ediləcək, eyni səbəbdən bərabər işarədən əvvəl və sonra boşluq qoymuruq. .

$ Simvolu bir dəyişənin dəyərini göstərmək üçün istifadə olunur. Misal üçün:

Skriptimizi dəyişdirək:

! / bin / bash
string1 = "salam"
string2 = dünya
string = $ string1 $ string2
echo $ string

Və yoxlayın:

Bash, C ++ kimi yüksək səviyyəli dillərdə olduğu kimi dəyişən növləri fərqləndirmir, dəyişənə həm ədəd, həm də simli təyin edə bilərsiniz. Eyni şəkildə bütün bunlar bir simli sayılacaq. Qabıq yalnız simli birləşməni dəstəkləyir, dəyişən adları ardıcıl olaraq yazın:

! / bin / bash
string1 = "salam"
string2 = dünya
string = $ string1 $ string2 \ və \ me
string3 = $ string1 $ string2 "və mən"
echo $ string3

Yoxlayırıq:

Diqqət yetirin ki, dediyim kimi, sətirdə xüsusi simvol yoxdursa, sitatlar isteğe bağlıdır. Simli birləşmənin hər iki yoluna daha yaxından baxın, burada da sitatların rolunun bir nümayişi var. Strings və ya arifmetik əməliyyatların daha mürəkkəb yollarına ehtiyacınız varsa, bu qabığın imkanlarına daxil deyil, bunun üçün adi kommunallardan istifadə edirsiniz.

Dəyişənlər və əmr çıxışı

İçindəki kommunalların yerinə yetirilməsinin nəticəsini yazmaq mümkün olmasa, dəyişənlər o qədər də faydalı olmazdı. Bunun üçün aşağıdakı sintaksisdən istifadə olunur:

$(əmr)

Bu quruluşla əmrin çıxışı birbaşa ekrana deyil, çağırıldığı yerə yönləndiriləcək. Məsələn, tarix yardım proqramı cari tarixi qaytarır. Bu əmrlər bərabərdir:

Başa düşürsən? Salam dünya və tarixin göstəriləcəyi bir ssenari yazaq:

string1 = "Salam dünya"
string2 = $ (tarix)

string = $ string1 $ string2

Dəyişənlər haqqında kifayət qədər bildiyinizə görə, bir bash skript yaratmağa hazırsınız, amma bu hamısı deyil. Sonra parametrlərə və nəzarət quruluşlarına baxacağıq. Xatırladım ki, bunların hamısı adi bash əmrləridir və onları bir faylda saxlamağa ehtiyac yoxdur, onları yolda dərhal icra edə bilərsiniz.

Skript parametrləri

İstifadəçi girişindən asılı olmayan bir bash skriptini yaratmaq həmişə mümkün olmur. Əksər hallarda istifadəçidən hansı hərəkəti etməli və ya hansı fayldan istifadə edəcəyini soruşmalısınız. Skript çağırarkən parametrləri ona ötürə bilərik. Bu parametrlərin hamısı ad olaraq ədəd kimi dəyişən olaraq mövcuddur.

1 adlı bir dəyişən birinci parametrin, dəyişənin 2, ikincinin və s. Bu bash skript ilk parametrin dəyərini çap edəcək:

! / bin / bash
1 dollar əks -səda

Skriptlərdə konstruksiyalara nəzarət

Müəyyən faktorları təhlil etmək və onlara cavab olaraq lazımi hərəkətləri yerinə yetirmək qabiliyyəti olmadan bir bash skriptinin yaradılması o qədər də faydalı olmazdı. Bu olduqca mürəkkəb bir mövzudur, ancaq bash skriptini yaratmaq çox vacibdir.

Bashın şərtləri yoxlamaq əmri var. Sintaksis aşağıdakı kimidir:

command_condition olarsa
sonra
əmr
başqa
əmr
fi

Bu əmr şərt əmrinin tamamlanma kodunu yoxlayır və əgər 0 (müvəffəqiyyət) sonra əmri və ya sonra sözündən sonra bir neçə əmri yerinə yetirir, tamamlama kodu 1 başqa bloku icra edilərsə, fi komanda blokunun sonu deməkdir.

Ancaq ən çox əmrin qaytarılma kodu ilə deyil, sətirlərin və ədədlərin müqayisəsi ilə maraqlandığımız üçün [[əmri təqdim edildi, bu da müxtəlif müqayisələr aparmağa və nəticənin nəticəsindən asılı olaraq geri qaytarma kodu verməyə imkan verir. müqayisə. Onun sintaksisi belədir:

[[parameter1 operator parametri2]]

Müqayisə üçün əvvəllər bizə tanış olan operatorlardan istifadə edirik<,>, = ,! = və s.İfadə doğru olarsa, əmr 0 qaytarar, yoxsa - 1. Terminalda davranışını bir az test edə bilərsiniz. Son əmrin qaytarılma kodu $? Dəyişənində saxlanılır:

İndi bütün bunları birləşdirin və şərti bir ifadə ilə bir skript alın:

! / bin / bash
əgər [[$ 1> 2]]
sonra
echo $ 1 "2 -dən çox"
başqa
echo 1 $ "2 və ya 2 -dən az"
fi

Əlbəttə ki, bu dizayn daha güclü qabiliyyətlərə malikdir, lakin bu məqalədə bunları əhatə etmək çox çətindir. Bəlkə də bu barədə sonra yazacam. Hələlik döngələrə keçək.

Skriptlərdə döngələr

Proqramların üstünlüyü ondan ibarətdir ki, hansı hərəkətlərin bir neçə dəfə yerinə yetirilməsi lazım olduğunu bir neçə sətirdə göstərə bilərik. Məsələn, bashda yalnız bir neçə sətirdən ibarət olan və parametrləri təhlil edən və lazımi hərəkətləri yerinə yetirən saatlarla icra olunan skriptlər yazmaq mümkündür.

Əvvəlcə for döngəsinə baxaq. Budur onun sintaksisi:

siyahıdakı dəyişənlər üçün
etmək
əmr
bitdi

Bütün siyahıdan keçir və siyahıdakı dəyəri dəyişənə öz növbəsində təyin edir, hər bir tapşırıqdan sonra do və bit arasında yerləşən əmrləri yerinə yetirir.

Məsələn, beş rəqəmin üzərində təkrar edək:

indeks üçün 1 2 3 4 5
etmək
echo $ index
bitdi

Və ya mövcud qovluqdakı bütün faylları siyahıya sala bilərsiniz:

$ faylında (ls -l); "$ file" yankısını verin; bitdi

Anladığınız kimi, yalnız adları göstərə bilməzsiniz, həm də lazımi hərəkətləri edə bilərsiniz, bu, bir baş skript yaratarkən çox faydalıdır.

Baxacağımız ikinci döngə bir müddət döngəsidir, şərt əmri 0, uğuru qaytardığı müddətcə işləyir. Sintaksisi nəzərdən keçirin:

əmr şərtidir
etmək
əmr
bitdi

Bir nümunəyə baxaq:

! / bin / bash
indeks = 1
isə [[$ index< 5 ]]
etmək
echo $ index
"index = index + 1" qoy
bitdi

Gördüyünüz kimi, hər şey yerinə yetirilir, let əmri sadəcə göstərilən riyazi əməliyyatı yerinə yetirir, bizim vəziyyətimizdə dəyişənin dəyərini bir artırır.

Bir şeyi daha qeyd etmək istərdim. Bir neçə sətirdə yazılmaq üçün nəzərdə tutulmuşdursa və bunları bir sətirdə yazmağa çalışsanız, bir səhv alacaqsınız. Ancaq buna baxmayaraq mümkündür, bunun üçün bir sətrin olması lazım olduğu yerdə ";" nöqtəli vergül qoyun. Məsələn, əvvəlki döngə tək bir xətt kimi icra oluna bilərdi:

indeks = 1; isə [[$ index< 5 ]]; do echo $index; let "index=index+1"; done;

Hər şey çox sadədir, məqaləni bashın əlavə şərtləri və imkanları ilə çətinləşdirməməyə çalışdım, yalnız ən əsas. Bəzi hallarda, bir baş skript üçün gui hazırlamağınız lazım ola bilər, sonra zenity və ya kdialog kimi proqramlardan istifadə edə bilərsiniz, onların köməyi ilə istifadəçiyə mesajları göstərmək və hətta ondan məlumat istəmək çox rahatdır.

nəticələr

İndi linuxda skriptin əsaslarını başa düşürsünüz və ehtiyac duyduğunuz skriptləri, məsələn, ehtiyat nüsxələr üçün yaza bilərsiniz. Baş yazılarına sıfırdan baxmağa çalışdım. Buna görə də bütün aspektlər nəzərə alınmadı. Ola bilsin ki, növbəti məqalələrdən birində bu mövzuya qayıdaq.

Üçün sadə bir bash skript yazmaq, bu sadə addımları atmalıyıq:

Hamısı necə işləyir:

skriptimizin ilk sətri #! / bin / bash, skriptimizin uğurla işləməsi üçün vacibdir.

ikinci sətir mkdir testdir testdir qovluğunu yaradır

üçüncü sətir cd testdir, yaradılmış testdir qovluğuna keçməyə imkan verir

əmr toxunmaq sonrakı sətirdə touch1 file2 file3 file3 üç fayl yaradır

və skriptimizin ls -al xəttindəki son əmr, əvvəlki sətir sayəsində üç boş faylın göründüyü cari qovluğun məzmununu göstərir.

Gördüyümüz kimi, içimizdə sadə skript bütün əmrlər yeni bir sətirdən başlayır. Hər bir xətt, ssenariyə başlayarkən, müəyyən hərəkətlər edərək öz işini ardıcıl olaraq yerinə yetirir.

Linux -da hər gün eyni əmrlərin (sabit parametrləri olan) bir zəncirini idarə edirsinizsə, eyni şeyi yazmağın mənası ola bilər. sadə bash skript vaxtınıza qənaət edəcək və işinizi avtomatlaşdıracaq.

Əlbəttə ki, Linux ilə ünsiyyət quranların hamısı ən azı bir dəfə BASH əmr qabığı ilə məşğul olmuşlar (heç olmasa dəqiq eşitmişlər). Ancaq BASH yalnız bir komut qabığı deyil, həm də əla bir skript proqramlaşdırma dilidir.
Bu yazının məqsədi istifadəçiləri bashla yaxından tanış etmək, dilin sintaksisi, əsas texnikaları və fəndləri haqqında danışmaqdır ki, hətta adi bir istifadəçi də gündəlik ( -həftəlik, aylıq) yerinə yetirmək üçün sadə bir skript yazsın. rutin iş və ya "diz üstü" bir kataloq ehtiyat nüsxəsi üçün bir skript yaradın.

Giriş

BASH-Bourne-Again SHell ("yenidən doğulmuş gəzinti" və ya "Bourne yenidən gəzdi (sh yaradıcısı)" kimi tərcümə oluna bilər), xüsusən GNU / Linux-da Unix kimi sistemlərdə ən populyar qabıqdır. Aşağıda skriptlərimizi yaratmaq üçün istifadə edəcəyimiz bir sıra daxili əmrlər verilmişdir.

For, while və ya loopdan çıxışı kəsin
for, while və ya qədər döngəsinin növbəti iterasiyasını icra etməyə davam edin
boşluqlarla ayrılmış echo çap arqumentləri standart çıxışa
çıxış qabığından çıxın
ixrac, ətrafdakı uşaq proseslərinə keçmək üçün arqumentləri dəyişən olaraq qeyd edir
hash, növbəti zəngdə onları axtarmamaq üçün arqument olaraq göstərilən əmrlərin tam uyğun yol adlarını xatırlayır.
kill prosesi öldürmə siqnalı göndərir
pwd cari iş qovluğunu göstərir
oxumaq shell girişindən bir sətir oxuyur və göstərilən dəyişənlərə dəyər təyin etmək üçün istifadə edir. \
return, shell funksiyasının göstərilən dəyərlə çıxmasına səbəb olur
shift mövqe parametrlərini sola keçirir
test şərti ifadəni qiymətləndirir
times, qabığın və onun nəslinin istifadə etdiyi istifadəçi adını və sistem vaxtını göstərir
trap, qabıq bir siqnal aldıqda işləyəcək əmrləri təyin edir
qurulmamış, qabıq dəyişənlərinin məhvinə səbəb olur
uşağın çıxmasını gözləyir və çıxış vəziyyətini bildirir.

Əlbəttə ki, quraşdırılmış əmrlərə əlavə olaraq, prosesdə artıq tanış olacağımız bir sıra xarici, ayrı-ayrı əmr proqramlarından istifadə edəcəyik.

Əvvəldən nə bilmək lazımdır

1. İstənilən bash skript aşağıdakı sətirdən başlamalıdır:

#! / bin / bash
#-dən sonra bu sətirdə! bash tərcüməçisinin yolu göstərilir, buna görə də başqa bir yerə quraşdırmısınızsa (harada bash yazaraq öyrənə bilərsiniz), onu yolunuza dəyişin.
2. Şərhlər # simvolu ilə başlayır (birinci sətir istisna olmaqla).
3. Bash -də dəyişənlərin növü yoxdur (bunlar aşağıda müzakirə olunacaq)

Dəyişənlər və skript parametrləri

Nümunə olaraq təhlil edəcəyimiz kiçik bir nümunə verəcəyəm:

#! / bin / bash
# bash tərcüməçisini harada saxladığımızı göstərin
parametr1 = $ 1 # parametr1 dəyişəninə skriptin ilk parametrinin dəyərini təyin edin
script_name = $ 0 # script_name dəyişəninə skript adının dəyərini təyin edin
echo "$ script_name adı və $ parametr1 parametri ilə bir skript işlədiniz" # echo əmri müəyyən bir xətt çıxarır, dəyişənlərə $ dəyişən_adı vasitəsi ilə daxil olur.
echo "$ script_name adı və $ parametr1 parametri ilə bir skript işlədiniz" # burada başqa sitatlar görürük, fərq tək dırnaqlarda dəyişən əvəz etmənin olmamasıdır.
çıxış 0 # 0 kodu ilə çıx (skriptin uğurla tamamlanması)

[e -poçt qorunur]: ~ $ ./test.sh qwerty
Qwerty parametri ilə. / Test.sh adlı bir skript işlədin
$ Script_name və $ parametr1 parametri adlı bir skript işlədin

Dəyişənləri necə istifadə edəcəyimizi və parametrləri skriptə necə ötürəcəyimizi gördükdən sonra ayrılmış dəyişənlərlə tanış olmağın vaxtı gəldi:

$ DIRSTACK - kataloq yığınının üst hissəsinin məzmunu
$ EDITOR - standart mətn redaktoru
$ EUID - Effektiv UID. Başqa bir istifadəçinin əmrlərini yerinə yetirmək üçün su istifadə etmisinizsə, bu dəyişən həmin istifadəçinin UID -ni ehtiva edir ...
$ UID - ... yalnız giriş zamanı təyin olunan həqiqi identifikatoru ehtiva edir.
$ FUNCNAME, skriptdəki cari funksiyanın adıdır.
$ GROUPS - cari istifadəçinin aid olduğu qruplar silsiləsi
$ HOME - istifadəçinin ev kataloqu
$ HOSTNAME ev sahibi adınızdır
$ HOSTTYPE - maşın arxitekturası.
$ LC_CTYPE - xarakter kodlamasını təyin edən daxili dəyişən
$ OLDPWD - köhnə iş kataloqu
$ OSTYPE - OS növü
$ PATH - proqram axtarış yolu
$ PPID - ana proses identifikatoru
$ SECONDS - skriptin işləmə müddəti (saniyə)
$ # - skriptə verilən parametrlərin ümumi sayı
$ * - bütün arqumentlər skriptə ötürülmür (sətrə çıxış)
[e -poçt qorunur]- əvvəlki ilə eynidir, lakin parametrlər bir sütunda göstərilir
$! - Arxa planda çalışan son prosesin PID
$$ - Ssenarinin özünün PID

Şərtlər

Şərti operatorlar, düşünürəm ki, indiyə qədər nəsə proqram yazmağa çalışan hər kəsə tanışdır. Bash -da şərtlər izlənilir. yol (hər zamanki kimi bir nümunə ilə):
#! / bin / bash
source = $ 1 # ilk skript parametrini mənbə dəyişəninə qoyur
dest = $ 2 # dest dəyişəninə ikinci skript parametri əlavə edin

Tırnak işarələrində [["$ source" -eq "$ dest"]] # varsa, müqayisə ediləcək dəyişənlərin adları göstərilir. -eq - "bərabər" mənasını verən boole müqayisəsi
sonra # əgər həqiqətən bərabərdirlərsə, deməli
echo "Proqram $ dest və source $ source eyni faylıdır!" # bir səhv mesajı göstərin, çünki $ source və $ dest bərabərdir
çıxış 1 # səhvlə çıx (1 - səhv kodu)
başqa # bərabər deyilsə
cp $ source $ dest # sonra cp əmrini yerinə yetirin: mənbəni təyinat yerinə kopyalayın
echo "Uğurlu surət!"
fi # şərtin sonunu bildirir.

Skriptin icrasının nəticəsi:
[e -poçt qorunur]: ~ $ ./primer2.sh 11 1
Tətbiq 1 və mənbə 1 eyni faylıdır!
[e -poçt qorunur]: ~ $ ./primer2.sh 1 2
Uğurlu kopyalama!

If-then-else quruluşu aşağıdakı kimi istifadə olunur:
əgər<команда или набор команд возвращающих код возврата(0 или 1)>
sonra
<если выражение после if истино, то выполняется этот блок>
başqa
<если выражение после if ложно, тот этот>
[[, [, Test, (())) və ya hər hansı digər (və ya bir neçə) linux-əmr quruluşları, qayıtma kodunu qaytaran əmrlər kimi çıxış edə bilər.
test - məntiqi müqayisə üçün istifadə olunur. ifadədən sonra bağlanan mötərizə "]" tələb olunur
[- test əmrinin sinonimi
[[- genişləndirilmiş versiya "[" (2.02 versiyasından bəri) (nümunədə olduğu kimi), içərisində || (və ya), & (və). Bağlanan mötərizədə olmalıdır "]]"
(()) - riyazi müqayisə.
formanın çox səviyyəli şərtlərini qurmaq üçün:
əgər ...
sonra ....
başqa
əgər ....
sonra ....
başqa ....

Kodun qısa və oxunaqlı olması üçün quruluşdan istifadə edə bilərsiniz:
əgər ..
sonra ...
elif ...
sonra ...
elif ...

Şərtlər. Çoxlu seçim

Çox sayda parametrlə tək bir dəyişəni müqayisə etmək lazımdırsa, case ifadəsini istifadə etmək daha məqsədəuyğundur.
#! / bin / bash
echo "Çalışmaq üçün bir redaktor seçin:"
echo "1 nano proqramı işə salın"
echo "2 Run vi proqramı"
echo "3 emacs proqramını başladın"
echo "4 Çıxış"
Burada # etdiyini oxuyun və standart girişdən $ dəyişənini oxuduq

Dava $ edir
1)
/ usr / bin / nano # əgər $ doing 1 ehtiva edirsə nano işlədin
;;
2)
/ usr / bin / vi # əgər $ doing 2 ehtiva edirsə, vi işləyin
;;
3)
/ usr / bin / emacs # əgər $ doing 3 ehtiva edirsə emacları işlədin
;;
4)
çıxış 0
;;
*) # klaviaturadan halda təsvir edilməyən bir şey daxil olunarsa, aşağıdakıları edin:
echo "Yanlış hərəkət daxil edildi"

Esac # bir iş ifadəsinin sonu.

İşin nəticəsi:
[e -poçt qorunur]: ~ $ ./menu2.sh
İşlətmək üçün redaktor seçin:
1 Nano proqramının işə salınması
2 vi proqramına başlayın
3 emacs proqramının işə salınması
4 Çıx

Nömrəni seçib Enter düyməsini basdıqdan sonra seçdiyiniz redaktor işə başlayacaq (əlbəttə ki, bütün yollar düzgün göstərilməyibsə və bu redaktorlar quraşdırılıbsa :))
If-then-else-fi qurulması üçün istifadə olunan məntiqi operatorların siyahısı:
-z # sətri boşdur
-n # sətri boş deyil
=, (==) # sətir bərabərdir
! = # sətir qeyri -bərabərdir
-eq # bərabərdir
- # bərabər deyil
-lt, (<) # меньше
-le, (<=) # меньше или равно
-gt, (>) # daha çox
-ge, (> =) # böyük və ya bərabər
! # boolean ifadənin inkar edilməsi
-a, (&&) # məntiqi VƏ
-o, (||) # məntiqi "OR"

Məqaləni çox yükləməmək üçün dilin əsaslarını və şərtlərini anladıq, onu bir neçə hissəyə (məsələn, 3 -ə) ayıracağam. İkinci hissədə loop operatorlarını və riyazi əməliyyatların yerinə yetirilməsini təhlil edəcəyik.

UPD: Bəzi səhvlər düzəldildi
UPD: If-then-else şərtləri haqqında hissə yeniləndi

Linux -da skriptlər yazmaq (nümunə ilə öyrənmək)

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

1. Giriş

Ssenarilər yazmaq üçün nə lazımdır
Komanda xətti alətləri və onların tələb olunan variantlarını bilmək.
İbtidai sinif səviyyəsində İngilis dilinin əsas bilikləri zərər verməyəcək.

Skriptlərə niyə ehtiyac var
Birincisi, bir Linux serverinin idarə edilməsi, bu və ya digər dərəcədə, eyni əmrlərin sistemli şəkildə yerinə yetirilməsindən qaynaqlanır. Üstəlik, bu əmrlərin bir şəxs tərəfindən yerinə yetirilməsinə ehtiyac yoxdur. Maşın tərəfindən icra edilmək üçün proqramlaşdırıla bilərlər.
İkincisi, hətta birdən-birə 20-1000-ə çatan ümumi bir vəzifəni yerinə yetirmək ... təkrarlanan əməliyyatları bir skriptdə həyata keçirmək çox asandır.

Ssenari nədir
Ssenari, kompüterin müəyyən bir qaydada və müəyyən bir zamanda yerinə yetirməli olduğu təlimatlar toplusudur. Təlimatlar ya daxili qabıq əmrləri ola bilər (döngələr, şərtlər, mətn məlumatlarının işlənməsi, mühit dəyişənləri ilə işləmək və s.), Ya da konsolda lazımi parametrlərlə icra etdiyimiz hər hansı bir proqram.

Ssenari necə yazılır
Bizim vəziyyətimizdə, skript icra xüsusiyyətlərinə malik bir mətn faylı olacaq. Bir skript faylı UNIX dünyasında sha-bang adlanan #! İlə başlayırsa, bu sistemə skriptin icrası üçün hansı tərcüməçinin istifadə etməli olduğunu bildirir. Anlamaq çətindirsə, unutmayın ki, bütün skriptləri tam olaraq #! / Bin / bash və ya #! / Bin / sh sətrindən başlayacağıq və sonra onlara əmr və şərhlər gələcək.

Ayrılıq sözləri
Ssenarinin demək olar ki, hər sətirinə mümkün qədər çox şərh yazmağı səmimi qəlbdən məsləhət görürəm. Vaxt keçəcək və bir dəfə yazılmış ssenarini dəyişdirmək və ya modernləşdirmək lazımdır. Ssenaridə yazılanları xatırlamırsınız və ya anlamırsınızsa, onu dəyişdirmək çətinləşir, sıfırdan yazmaq daha asandır.

Hansı skriptlərə ehtiyacımız ola bilər:

    sistem açıldıqda təhlükəsizlik duvarı qaydalarını təyin etmək.
    parametrlərin və məlumatların ehtiyat nüsxəsini çıxarmaq.
    poçt serverlərinə poçt qutuları əlavə etmək (daha doğrusu mysql verilənlər bazasına)
    müəyyən bir zamanda (tercihen hər gecə) proxy server qeydlərini tarayan və yüklənmiş trafik miqdarı ilə əlaqədar rahat bir veb hesabatı hazırlayan bir proqramı işə salır.
    kiminsə serverimizə ssh, əlaqə vaxtı və müştərinin ünvanı vasitəsi ilə giriş əldə etdiyi barədə məlumatları poçtla bizə göndərmək.

Skript üsulları haqqında
Bir mətn faylı yaradırıq, redaktə edirik, icra icazələrini təyin edirik, işə salırıq, səhvləri yoxlayırıq, düzəldirik, işə salırıq, səhvləri yoxlayırıq ...
Hər şey yalandıqda və düzgün işlədikdə onu müəyyən müddətə avtomatik yükləmə və ya planlaşdırıcıya qoyduq.

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

2. Daxili BASH dilində skript yazmağı öyrənmək
orijinal: https://www.linuxconfig.org/Bash_scripting_Tutorial

Bu təlimat daxili Bash dilindən istifadə edərək skript (skript) texnikası haqqında əvvəlcədən heç bir məlumatı nəzərdə tutmur. Bu təlimatla tezliklə skript yazmağın çox asan bir iş olduğunu görəcəksiniz. Dərsliyimizə "Hello World!" Sətrini çıxaran sadə bir skriptlə başlayaq. (İngilis dilindən tərcümədə - Hamıya salam!)

1. "Hamıya salam" ssenarisi
İlk bash skript nümunəniz budur:

#! / bin / bash
echo "Salam Dünya"

Hello_world.sh faylımızın olduğu qovluğa gedin və onu icra olun:

Kod: $ chmod + x hello_world.sh hər şeyi seçin

İcra üçün skript işlədin

Kod: Hamısını seçin $ ./hello_world.sh

2. Sadə bir arxivləşdirmə bash skriptidir

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

Kod: Hamısını seçin $ ./backup.sh

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

3. Dəyişənlərlə işləmək
Bu nümunədə sadə bir dəyişən elan edirik və echo əmrindən istifadə edərək ekrana çap edirik

#! / bin / bash
STRING = "SALAM DÜNYA !!!"
$ STRING əks -sədası

Kod: Hamısını seçin $ ./hello_world.sh
SALAM DÜNYA !!!

Dəyişənlərlə arxivləşdirmə skriptimiz:

#! / bin / bash
OF = myhome_directory _ $ (tarix +% Y% m% d) .tar.gz
IF = / ev / istifadəçi
tar -czf $ OF $ IF

Kod: Hamısını seçin $ ./backup.sh
tar: Üzv adlarından aparıcı "\" silinir
$ du -sh * tar.gz
41M myhome_directory_20100123.tar.gz

3.1 Qlobal və yerli dəyişənlər

#! / bin / bash
# Qlobal dəyişən elan edin
# Belə bir dəyişən bu skriptin hər hansı bir yerində istifadə edilə bilər
VAR = "qlobal dəyişən"
bash funksiyası (
# Yerli bir dəyişən elan edin
# Belə bir dəyişən yalnız elan edildiyi funksiya üçün etibarlıdır
yerli VAR = "yerli dəyişən"
$ VAR -ın əks -sədası
}
$ VAR -ın əks -sədası
bash
# Qeyd edək ki, qlobal dəyişən dəyişməyib
$ VAR -ın əks -sədası

Kod: Bütün $ ./variables.sh seçin
qlobal dəyişən
yerli dəyişən
qlobal dəyişən

4. Ssenariyə arqumentlərin verilməsi

#! / bin / bash
# Arqumentlərə daxil olmaq üçün əvvəlcədən təyin edilmiş dəyişənlərdən istifadə edin
# Arqumentləri ekranda göstərin
echo $ 1 $ 2 $ 3 '-> echo $ 1 $ 2 $ 3'

# Xüsusi args = (" [e -poçt qorunur]»)
# Arqumentləri ekranda göstərin
echo $ (args) $ (args) $ (args) ‘-> args = (“ [e -poçt qorunur]"); echo $ (args) $ (args) $ (args) '

# Bir dəyişəndən istifadə et [e -poçt qorunur] bütün arqumentləri bir anda çıxarmaq
əks -səda [e -poçt qorunur]‘-> əks-səda [e -poçt qorunur]

Skriptə verilən arqumentlərin sayını göstərmək üçün $ # dəyişənindən istifadə edin
echo Keçmiş arqumentlərin sayı: $ # ‘-> echo Keçmiş arqumentlərin sayı: $ # '

Kod: Hamısını seçin $ ./arguments.sh Bash Skripti Dərsliyi
Bash Scripting Tutorial -> echo $ 1 $ 2 $ 3
Bash Scripting Tutorial -> args = (" [e -poçt qorunur]"); echo $ (args) $ (args) $ (args)
Bash Scripting Tutorial -> echo [e -poçt qorunur]
Keçirilən arqumentlərin sayı: 3 -> echo Keçmiş arqumentlərin sayı: $ #

5. Bir skriptdə shell əmrlərinin yerinə yetirilməsi

#! / bin / bash
# shell əmrini yerinə yetirmək üçün "" "" işarələrini istifadə edin
echo `uname -o`
# indi gəlin tırnak işarəsi olmadan sınayaq
echo uname -o

Kod: Bütün $ uname -o seçin
GNU / Linux
$ ./bash_backtricks.sh
GNU / Linux
uname -o

Gördüyünüz kimi, ikinci halda, əmrin icrasının nəticəsi deyil, özü göstərildi.

6. İstifadəçi girişinin oxunması (interaktivlik)

#! / bin / bash
echo -e "Salam, lütfən sözü yazın: \ c"
söz oxumaq
echo "Daxil etdiyiniz söz: $ word"
echo -e “Zəhmət olmasa iki söz daxil edə bilərsiniz? "
word1 word2 oxuyun
echo "Girişiniz budur: \" $ word1 \ "\" $ word2 \ ""
echo -e “Baş skriptləri haqqında nə düşünürsünüz? "
# oxumaq əmri indi bir cavabı $ REPLY standart quraşdırılmış dəyişəninə saxlayır
oxumaq
echo “$ REPLY dediniz, bunu eşitdiyim üçün şadam! "
echo -e “Ən sevdiyiniz rənglər hansılardır? "
# -a oxumaq əmrini bir sıra halına gətirir
-rəngləri oxuyun
echo "Ən sevdiyim rənglər də $ (rənglər), $ (rənglər) və $ (rənglər) :-)"

Kod: Bütün $ ./read.sh seçin
Salam, zəhmət olmasa sözü yazın: bir şey
Daxil etdiyiniz söz: bir şeydir
Zəhmət olmasa iki söz daxil edə bilərsiniz?
Debian Linux
Girişiniz budur: "Debian" "Linux"
Bash skriptləri ilə bağlı nə düşünürsünüz?
yaxşı
Yaxşı dediniz, eşidəndə şadam!
Ən sevdiyiniz rənglər hansılardır?
mavi yaşıl qara
Ən sevdiyim rənglər də mavi, yaşıl və qara :-)

7. Tələdən istifadə etməklə

#! / bin / bash
# tələ elan edin
tələ bashtrap INT
# ekranı silin
aydın;
# istifadəçi CTRL-C düyməsini basdıqda çəngəl funksiyası icra olunur:
# Ekranda => Baş tutan alt proqram icra olunur!
# amma ssenari icra olunmağa davam edəcək
bashtrap ()
{
echo "CTRL + C Algılandı! ... bash tələsi icra edilir!"
}
# skript 10 -a qədər sayılacaq
a in seq 1 10` üçün; etmək
echo "Çıxış üçün $ a / 10".
yuxu 1;
bitdi
echo "Bash Trap Nümunəsindən çıxın !!!"

Kod: Hamısını seçin $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL + C aşkarlandı! ... bash tələsi icra olunur!
10/10
Bash Trap Nümunəsindən çıxın !!!

Gördüyünüz kimi, Ctrl-C düymələrinin birləşməsi skriptin icrasını dayandırmadı.

8. Dizilər
8.1 Sadə bir sıra elan etmək

#! / bin / bash
# 4 elementdən ibarət sadə bir sıra elan edin
ARRAY = ('Debian Linux' '' Redhat Linux 'Ubuntu Linux)
# Dizidəki elementlərin sayını əldə edin
ELEMANLAR = $ (# ARRAY [@])

serialın hər bir elementi bir döngədə # çıxış
üçün ((i = 0; i<$ELEMENTS;i++)); do
echo $ (ARRAY [$ (i)])
bitdi

Kod: Hamısını seçin $. / Arrays.sh
Debian Linux
Redhat Linux
Ubuntu
Linux

8.2 Dosyanı fayldakı dəyərlərlə doldurun

#! / bin / bash
# Bir sıra elan edin
-a ARRAY elan edin
# Exec əmri # stdin (adətən klaviatura) bu fayldan hazırlanacaq. Bu oxumağı mümkün edir
# faylın məzmununu, sətir satır və sed və / və ya awk ilə daxil edilmiş hər sətri təhlil edin.
icra 10 sayaq = 0

LINE oxuyarkən<&10; do

ARRAY [$ count] = $ LINE
((say ++))
bitdi

echo Elementlərin sayı: $ (# ARRAY [@])
# Array dəyərlərinin çıxarılması
echo $ (ARRAY [@])
# faylı bağlayın
exec 10> & -

Kod: Bütün $ cat bash.txt seçin
Debian Linux
Redhat Linux
Ubuntu
Linux
$ ./array.sh
Elementlərin sayı: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Əgər-sonra-başqa şərtlər
9.1. "Əks halda" şərtlərinin sadə istifadəsi
Kvadrat mötərizədəki boşluqlara diqqət yetirin, onsuz şərt işləməyəcək.

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

# kataloqun olub olmadığını yoxlayın
əgər [-d $ kataloq]; sonra
echo "Kataloq mövcuddur"
başqa
echo "Kataloq yoxdur"
fi

Kod: Hamısını seçin $ ./if_else.sh
Kataloqu yoxdur
$ mkdir BashScripting
$ ./if_else.sh
Kataloq mövcuddur

9.2

#! / bin / bash
# 4 dəyəri olan bir dəyişən elan edin
seçim = 4
# Göstərilir
əks -səda "1. Bash "
əks -səda "2. Ssenari "
əks -səda "3. Təlimat "

# Dəyişən dörd olana qədər icra edin
# Döngə
isə [$ choice -eq 4]; etmək

# istifadəçi girişini oxuyun
seçim oxumaq
# başqa şərtlə iç içə
əgər [$ choice -eq 1]; sonra

echo "Söz seçmisiniz: Bash"

əgər [$ choice -eq 2]; sonra
echo "Söz seçmisiniz: Skript"
başqa

əgər [$ choice -eq 3]; sonra
echo "Söz seçmisiniz: Dərslik"
başqa
echo "1-3 arasında seçim edin!"
əks -səda "1. Bash "
əks -səda "2. Ssenari "
əks -səda "3. Təlimat "
echo -n “Zəhmət olmasa bir söz seçin? "
seçim = 4
fi
fi
fi
bitdi

Kod: Bütün $ ./nested.sh seçin
1. Baş
2. Ssenari
3. Dərslik

5

1. Baş
2. Ssenari
3. Dərslik
Zəhmət olmasa bir söz seçin?
4
Zəhmət olmasa 1-3 arasında seçim edin!
1. Baş
2. Ssenari
3. Dərslik
Zəhmət olmasa bir söz seçin?
3
Söz seçmisiniz: Dərslik

Beləliklə, əvvəlcə "while" döngəsinin gövdəsi yerinə yetirilir dəyişən seçim əvvəlcə dördə bərabərdir. Sonra istifadəçi girişini oxuyuruq və giriş 1.2 və ya 3 -ə bərabər deyilsə, döngənin gövdəsi təkrarlandığı üçün dəyişənimizi yenidən 4 -ə bərabər edirik (yenidən 1.2 daxil etmək lazımdır) və ya 3).

10. Müqayisələr
10.1 Aritmetik müqayisə

Leytenant<
-gt>
-le<=
-ge> =
-bərabər ==
-ne! =

#! / bin / bash

NUM1 = 2
NUM2 = 2
əgər [$ NUM1 -eq $ NUM2]; sonra
echo "Hər iki dəyər bərabərdir"
başqa
echo "Dəyərlər bərabər deyil"
fi

Kod: Hamısını seçin $ ./equals.sh
Hər iki dəyər bərabərdir

#! / bin / bash
# Tam ədəd dəyərləri olan dəyişənləri elan edin
NUM1 = 2
NUM2 = 3
əgər [$ NUM1 -eq $ NUM2]; sonra
echo "Hər iki dəyər bərabərdir"
başqa
echo "Dəyərlər bərabər deyil"
fi

Kod: Hamısını seçin $ ./equals.sh
Dəyərlər bərabər deyil

#! / bin / bash
# Tam ədəd dəyərləri olan dəyişənləri elan edin
NUM1 = 2
NUM2 = 1
əgər [$ NUM1 -eq $ NUM2]; sonra
echo "Hər iki dəyər bərabərdir"
elif [$ NUM1 -gt $ NUM2]; sonra
echo "$ NUM1 $ NUM2 -dən böyükdür"
başqa
echo "$ NUM2, $ NUM1 -dən böyükdür"
fi

Kod: Hamısını seçin $ ./equals.sh
2 1 -dən böyükdür

10.2 Simvolik-Mətn Müqayisələri

Eyni
! = eyni deyil
< меньще чем
> daha çox
-n s1 dəyişən s1 boş deyil
-z s1 dəyişən s1 boşdur

#! / bin / bash

S1 = "Baş"

S2 = "Skript"
əgər [$ S1 = $ S2]; sonra

başqa
echo "Strings bərabər deyil"
fi

Kod: Hamısını seçin $ ./statement.sh
Sətirlər bərabər deyil

#! / bin / bash
# S1 simvolik dəyişənini elan edin
S1 = "Baş"
# S2 simvolik dəyişənini elan edin
S2 = "Baş"
əgər [$ S1 = $ S2]; sonra
echo "Hər iki sətir bərabərdir"
başqa
echo "Strings bərabər deyil"
fi

Kod: Hamısını seçin $ ./statement.sh
Hər iki sətir bərabərdir

11. Faylların yoxlanılması

B fayl adı Xüsusi faylı blok edin
-c fayl adı Xüsusi xarakterli fayl
-d qovluq adı Kataloqun mövcudluğunu yoxlayın
-e fayl adı Faylın mövcudluğunu yoxlayın
-f fayl adı Bir qovluğun yox, müntəzəm faylların olub olmadığını yoxlayın
-G fayl adı Faylın olub olmadığını və təsirli qrup kimliyinə aid olduğunu yoxlayın.
-g fayl adı doğrudur, əgər fayl mövcuddur və qrup-iddir.
-k fayl adı Yapışqan bit
-L fayl adı Simvolik keçid
-O fayl adı Doğru, əgər fayl mövcuddursa və effektiv istifadəçi idinə məxsusdur.
-r fayl adı Faylın oxunaqlı olub olmadığını yoxlayın
-S fayl adı Faylın yuva olub olmadığını yoxlayın
-s fayl adı Faylın sıfırdan böyük olmadığını yoxlayın
-u fayl adı Fayl set-ser-id bitinin təyin edilib-edilmədiyini yoxlayın
-w fayl adı Faylın yazıla biləcəyini yoxlayın
-x fayl adı Faylın icra oluna biləcəyini yoxlayın

#! / bin / bash
fayl = "./ fayl"
əgər [-e $ fayl]; sonra
echo "Fayl var"
başqa
echo "Fayl yoxdur"
fi

Kod: Bütün $ ls seçin
file.sh
$ ./file.sh
Fayl yoxdur
$ toxunma faylı
$ ls
fayl file.sh
$ ./file.sh
Fayl mövcuddur

Misal üçün, faylın olmadığını yoxlamaq üçün "while" döngələrindən istifadə edə bilərik. Bu skript, fayl olmadıqda yuxuya gedəcək. Bash inkarçısına "!" Diqqət yetirin. -e seçimini inkar edən (tərsinə çevirən).

12. Dövrlər
12.1. Döngü üçün

#! / bin / bash
# döngə üçün
f üçün $ (ls / var /); etmək
echo $ f
bitdi

Bash əmr satırından for for loopunun işə salınması:

Kod: $ üçün f üçün $ hər şeyi seçin (ls / var /); $ f əks -sədası; bitmiş Kod: $ üçün f üçün $ hər şeyi seçin (ls / var /); $ f əks -sədası; bitdi
ehtiyat nüsxələr
gizli yer
qəza
oyunlar
lib
yerli
bağlamaq
giriş
poçt
seçmək
qaçmaq
makara
tmp
www

12.2. Döngə zamanı

#! / bin / bash
SAYI = 6
# döngə
isə [$ COUNT -gt 0]; etmək

COUNT = COUNT-1 olsun
bitdi

Kod: Bütün $ ./ while_loop.sh seçin
Sayma dəyəri: 6
Sayma dəyəri: 5
Sayma dəyəri: 4
Sayma dəyəri: 3
Sayma dəyəri: 2
Sayma dəyəri: 1

12.3. Döngəyə qədər

#! / bin / bash
COUNT = 0
# döngəyə qədər
[$ COUNT -gt 5] qədər; etmək
echo Sayma dəyəri: $ COUNT
COUNT = COUNT + 1 qoyun
bitdi

Kod: Hamısını seçin $ ./until_loop.sh
Sayma dəyəri: 0
Sayma dəyəri: 1
Sayma dəyəri: 2
Sayma dəyəri: 3
Sayma dəyəri: 4
Sayma dəyəri: 5

12.4. Gizli şərtləri olan döngələr
Aşağıdakı nümunədə, bir müddətlik döngənin şərti standart girişin olmasıdır.
Standart çıxışdan oxumaq əmrinə yönləndiriləcək bir şey olduğu müddətcə döngənin gövdəsi icra ediləcək.

#! / bin / bash
# Bu skript boşluqları axtaracaq və siləcək
# fayllarda, alt xəttlərlə əvəz edin
DIR = "."
Bir döngədə çıxışı yönləndirərək oxu əmri ilə bir döngəyə nəzarət.
$ DIR tipli f | tapın fayl oxunarkən; etmək
# fayl adlarında boşluq tapmaq üçün POSIX sinifini [: space:] istifadə edin
əgər [["$ file" = * [[: space:]] *]]; sonra
# boşluqları alt xəttlərlə əvəz edin
mv "$ file" `echo $ file | tr '' '_' '
fi;
bitdi

Kod: Hamısını seçin $ ls -1
skript.sh
$ touch "boşluqlu fayl"
$ ls -1
boşluqları olan fayl
skript.sh
$ ./script.sh
$ ls -1
file_with_spaces
script.sh

13. Funksiyalar

#! / bin / bash
# Funksiyalar istənilən qaydada elan edilə bilər
funksiya_B (
echo funksiyası B.
}
funksiya_A (
1 dollar əks -səda
}
funksiya_D (
echo funksiyası D.
}
funksiyası function_C (
1 dollar əks -səda
}
# Zəng funksiyaları
A funksiyasını yerinə yetirmək üçün # keçid parametri
function_A "A funksiyası."
funksiya_B
# C funksiyasını yerinə yetirmək üçün parametr
function_C "C funksiyası."
funksiya_D

Kod: Bütün $ ./functions.sh seçin
Funksiya A.
Funksiya B.
C funksiyası.
Funksiya D.

14. Operator seçimi - Seçin

#! / bin / bash
PS3 = 'Bir söz seçin:'
# seçin
"linux" "bash" "scripting" "tutorial" da söz seçin
etmək
echo "Seçdiyiniz söz: $ word"
# Abort edin, əks halda döngə sonsuz olacaq.
fasilə
bitdi
çıxış 0

Kod: Hamısını seçin $ ./select.sh
1) linux
2) bash
3) skript
4) dərslik
Bir söz seçin: 4
Seçdiyiniz söz: dərslik

15. Seçim operatoru - Case

#! / bin / bash
echo "Tercih etdiyiniz proqramlaşdırma / skript dili hansıdır"
echo "1) bash"
echo "2) perl"
echo "3) fiton"
echo "4) c ++"
echo "5) Bilmirəm!"
işi oxumaq;
# sadə hal seçimi quruluşu
# unutmayın ki, bu nümunədə $ case sadəcə dəyişəndir
# və belə adlandırmaq lazım deyil. Bu sadəcə bir nümunədir
halda $ halda
1) echo "Siz bash seçdiniz" ;;
2) echo "Siz perl seçdiniz" ;;
3) echo "Siz fiton seçdiniz" ;;
4) echo "C ++ seçdiniz" ;;
5) çıxmaq
esac

Kod: Hamısını seçin $ ./case.sh
Tercih etdiyiniz proqramlaşdırma / skript dili hansıdır
1) bash
2) perl
3) fiton
4) c ++
5) Bilmirəm!
4
C ++ seçmisiniz

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

Daha ətraflı məlumatı müxtəlif mənbələrdən əldə etmək olar, məsələn buradan
orijinal: 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