Menu
Za darmo
Rejestracja
dom  /  Nawigatorzy/ Pisanie skryptów w Bash. Pisanie skryptów w Linuksie (nauka na przykładach) Co musisz wiedzieć od samego początku

Pisanie skryptów w Bash. Pisanie skryptów w Linuksie (nauka na przykładach) Co musisz wiedzieć od samego początku

Pisanie skryptów w systemie Linux (nauka na przykładach)

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

1. Wstęp

Co jest potrzebne do pisania skryptów
Własność narzędzi wiersz poleceń i ich wymagane opcje.
Podstawowa wiedza po angielsku poziom szkoły podstawowej nie będzie przeszkadzał.

Dlaczego skrypty są potrzebne
Po pierwsze, administracja serwerem linuksowym sprowadza się w mniejszym lub większym stopniu do systematycznego wykonywania tych samych poleceń. Co więcej, nie jest konieczne, aby te polecenia były wykonywane przez osobę. Można je zaprogramować do wykonania przez maszynę.
Po drugie, nawet wykonanie zwykłego zadania, które (nagle) wynosi 20-1000… powtarzalnych operacji, jest DUŻO łatwiejsze do zaimplementowania w skrypcie.

Co to jest skrypt
Skrypt to zestaw instrukcji, które muszą być ułożone w określonej kolejności iw określonym porządku określony czas uruchomić komputer. Instrukcje mogą być polecenia wewnętrzne powłoki (pętle, warunki, przetwarzanie informacje tekstowe, pracować z Zmienne środowiska itp.), a także dowolny program, który uruchamiamy w konsoli z niezbędnymi parametrami.

Jak napisać skrypt
W naszym przypadku skrypt będzie plik tekstowy z atrybutami wykonawczymi. Jeśli plik skryptu zaczyna się od #!, co w świecie UNIX nazywa się sha-bang, mówi to systemowi, którego interpretera użyć do wykonania skryptu. Jeśli jest to trudne do zrozumienia, to pamiętaj tylko, że wszystkie skrypty zaczniemy pisać od linii #!/bin/bash lub #!/bin/sh, a następnie polecenia i komentarze do nich pójdą.

pożegnalne słowo
Szczerze radzę napisać jak najwięcej komentarzy do prawie każdej linii w skrypcie. Czas upłynie i trzeba będzie zmienić lub unowocześnić raz napisany scenariusz. Jeśli nie pamiętasz lub nie rozumiesz, co jest napisane w skrypcie, trudno jest to zmienić, łatwiej jest pisać od zera.

Jakich skryptów możemy potrzebować:

    ustawianie reguł zapory sieciowej podczas uruchamiania systemu.
    wykonywanie kopii zapasowej ustawień i danych.
    uruchomienie o określonej godzinie (najlepiej każdej nocy) programu, który skanuje logi serwera proxy i generuje wygodny raport internetowy o ilości pobieranego ruchu.
    przesyłanie nam pocztą informacji, że ktoś uzyskał dostęp do naszego serwera przez ssh, czas połączenia i adres klienta.

O technice skryptowej
Tworzymy plik tekstowy, edytujemy go, ustalamy uprawnienia wykonawcze, uruchamiamy, sprawdzamy błędy, naprawiamy, uruchamiamy, sprawdzamy błędy...
Kiedy wszystko jest dograne i działa poprawnie, umieszczamy to w autoload lub w harmonogramie na określony czas.

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

2. Nauka pisania skryptów w wewnętrznym języku BASH
oryginał: https://www.linuxconfig.org/Bash_scripting_Tutorial

Ten przewodnik nie zakłada wcześniejszej wiedzy na temat pisania skryptów (zwanych dalej skryptami). język wewnętrzny grzmotnąć. Z pomocą tego przewodnika szybko odkryjesz, że pisanie skryptów jest bardzo ważne proste zadanie. Zacznijmy nasz samouczek od prostego skryptu, który drukuje ciąg „Hello World!” (przetłumaczone z angielskiego - Cześć wszystkim!)

1. Scenariusz „Cześć wszystkim”
Oto twój pierwszy przykład skryptu bash:

#!/bin/bash
echo „Witaj świecie”

Przejdź do katalogu zawierającego nasz plik hello_world.sh i uczyń go wykonywalnym:

Kod: Zaznacz wszystko $ chmod +x hello_world.sh

Uruchom skrypt do wykonania

Kod: Zaznacz wszystkie $ ./hello_world.sh

2. Prosty skrypt bash do archiwizacji

#!/bin/bash
tar -czf mój katalog_domowy.tar.gz /home/user

Kod: Zaznacz wszystko $ ./backup.sh

$ du -sh mój katalog_domowy.tar.gz
41M mójkatalog_domowy.tar.gz

3. Praca ze zmiennymi
W tym przykładzie deklarujemy prostą zmienną i wyświetlamy ją na ekranie za pomocą polecenia echo.

#!/bin/bash
STRING="WITAJ ŚWIECIE!!!"
echo $STRING

Kod: Zaznacz wszystkie $ ./hello_world.sh
WITAJ ŚWIECIE!!!

Nasz skrypt archiwizujący ze zmiennymi:

#!/bin/bash
OF=myhome_directory_$(data +%Y%m%d).tar.gz
JEŻELI=/dom/użytkownik
tar -czf $Z $JEŻELI

Kod: Zaznacz wszystko $ ./backup.sh
tar: Usuwanie początkowego „\” z nazw członków
$ du -sh *tar.gz
41M myhome_directory_20100123.tar.gz

3.1 Zmienne globalne i lokalne

#!/bin/bash
# Zadeklaruj zmienną globalną
# Tej zmiennej można użyć w dowolnym miejscu tego skryptu
VAR="zmienna globalna"
bash funkcji (
# Zadeklaruj zmienną lokalną
# Taka zmienna jest poprawna tylko dla funkcji, w której została zadeklarowana
lokalne VAR="zmienne lokalne"
powtórz $VAR
}
powtórz $VAR
grzmotnąć
# Zauważ, że zmienna globalna nie uległa zmianie
powtórz $VAR

Kod: Zaznacz wszystkie $ ./variables.sh
zmienna globalna
zmienna lokalna
zmienna globalna

4. Przekazywanie argumentów do skryptu

#!/bin/bash
# Użyj predefiniowanych zmiennych, aby uzyskać dostęp do argumentów
# Wydrukuj argumenty na ekranie
echo 1 $ 2 $ 3 ' -> echo 1 $ 2 $ 3'

#Możemy również uzyskać dostęp do argumentów poprzez specjalną tablicę args=("$@")
# Wydrukuj argumenty na ekranie
echo $(args) $(args) $(args) ‘ -> args=("$@"); echo $(args) $(args) $(args)'

# Użyj zmiennej $@, aby wyświetlić wszystkie argumenty na raz
echo $@ ‘ -> echo $@’

Użyj zmiennej $#, aby wyświetlić liczbę argumentów przekazanych do skryptu
echo Liczba przekazanych argumentów: $# ‘ -> echo Liczba przekazanych argumentów: $#’

Kod: Zaznacz wszystko $ ./arguments.sh Samouczek skryptów Bash
Samouczek skryptów Bash -> echo 1 $ 2 $ 3
Samouczek tworzenia skryptów w Bash -> args=("$@"); echo $(argumenty) $(argumenty) $(argumenty)
Samouczek dotyczący skryptów Bash -> echo $@
Liczba przekazanych argumentów: 3 -> echo Liczba przekazanych argumentów: $#

5. Wykonywanie poleceń powłoki w skrypcie

#!/bin/bash
# używać cytaty z powrotem» ` ` » aby wykonać polecenie powłoki
echo `unazwa -o`
# teraz spróbujmy bez cudzysłowów
echo unazwa -o

Kod: Zaznacz wszystko $ uname -o
GNU/Linux
$ ./bash_backtricks.sh
GNU/Linux
uname-o

Jak widać, w drugim przypadku wyświetliło się samo polecenie, a nie wynik jego wykonania.

6. Przeczytaj dane wprowadzone przez użytkownika (interaktywność)

#!/bin/bash
echo -e "Cześć, proszę wpisać słowo: \c"
przeczytaj słowo
echo "Wprowadzone słowo to: $słowo"
echo -e „Czy możesz wpisać dwa słowa? »
przeczytaj słowo 1 słowo 2
echo "Oto twój wpis: \"$słowo1\" \"$słowo2\""
echo -e „Co sądzisz o skryptach bash? »
# polecenie read przechowuje teraz odpowiedź w domyślnej wbudowanej zmiennej $REPLY
Czytać
echo "Powiedziałeś $ODPOWIEDZ, miło mi to słyszeć! »
echo -e "Jakie są twoje ulubione kolory? »
# -a sprawia, że ​​polecenie read jest wczytywane do tablicy
czytaj -kolory
echo "Moje ulubione kolory to również $(kolory), $(kolory) i $(kolory):-)"

Kod: Zaznacz wszystko $ ./read.sh
Cześć, proszę wpisać słowo: coś
Wpisane słowo to: coś
Czy możesz wpisać dwa słowa?
Debian Linux
Oto Twój wkład: „Debian” „Linux”
Co sądzisz o skryptach bash?
Dobry
Dobrze powiedziałeś, miło mi to słyszeć!
Jakie są Twoje ulubione kolory?
niebieski zielony czarny
Moje ulubione kolory to niebieski, zielony i czarny :-)

7. Korzystanie z pułapki

#!/bin/bash
# zadeklarować pułapkę
trap bashtrap INT
# wyczyść ekran
jasne;
# funkcja przechwytywania jest wykonywana, gdy użytkownik naciśnie CTRL-C:
# Wyświetli się => Wykonywanie podprogramu pułapki bash!
# ale skrypt będzie nadal działał
bashtrap()
{
echo "CTRL+C wykryto!…wykonywanie pułapki bash!"
}
# skrypt policzy do 10
dla a w „nast. 1 10”; Do
echo "$a/10 do wyjścia."
sen1;
zrobione
echo „Wyjdź z przykładu pułapki Bash!!!”

Kod: Zaznacz wszystkie $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL+C Wykryto!...wykonywanie pułapki bash!
10/10
Przykład wyjścia z pułapki Bash!!!

Jak widać, kombinacja klawiszy Ctrl-C nie zatrzymała wykonywania skryptu.

8. Tablice
8.1 Deklaracja prostej tablicy

#!/bin/bash
# Zadeklaruj prostą tablicę z 4 elementami
TABLICA=('Debian Linux' 'Redhat Linux' ubuntu linux)
# Pobierz liczbę elementów w tablicy
ELEMENTY=$(#TABLICA[@])

# pętla przez każdy element tablicy
dla ((i=0;i<$ELEMENTS;i++)); do
echo $(TABLICA[$(i)])
zrobione

Kod: Zaznacz wszystkie $./arrays.sh
Debian Linux
Linux redhat
ubuntu
Linuks

8.2 Wypełnianie tablicy wartościami z pliku

#!/bin/bash
# Zadeklaruj tablicę
zadeklaruj -TABLICĘ
#wykonaj polecenie # stdin (zwykle klawiatura) zostanie utworzone z tego pliku. Dzięki temu można czytać
# zawartość pliku linia po linii i analizuje każdą linię wprowadzoną za pomocą sed i/lub awk.
wykonawca 10 letcount=0

podczas czytania LINI<&10; do

TABLICA[$liczba]=$LINIA
((liczba++))
zrobione

echo Liczba elementów: $(#TABLICA[@])
# Wyświetl wartości tablicy
echo $(TABLICA[@])
# zamknij plik
wykonaj 10>&-

Kod: zaznacz wszystko $ cat bash.txt
Debian Linux
Linux redhat
ubuntu
Linuks
$ ./tablice.sh
Liczba elementów: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Warunki jeśli-to-inaczej
9.1. Proste użycie warunków „if-else”.
Zwróć uwagę na spacje w nawiasach kwadratowych, bez których warunek nie zadziała.

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

# sprawdź, czy katalog istnieje
if [-d $katalog]; Następnie
echo "Katalog istnieje"
w przeciwnym razie
echo "Katalog nie istnieje"
fi

Kod: Zaznacz wszystkie $ ./if_else.sh
Katalog nie istnieje
$ mkdir BashScripting
$ ./if_else.sh
Katalog istnieje

9.2 Zagnieżdżone warunki if-else

#!/bin/bash
# Zadeklaruj zmienną o wartości 4
wybór=4
# Wyświetlacz
echo "1. grzmotnąć"
echo"2. Skrypty »
echo "3. Instruktaż"

# Wykonaj, gdy zmienna jest równa cztery
# zapętlanie
podczas gdy [ $wybór -eq 4 ]; Do

# przeczytaj dane wprowadzone przez użytkownika
przeczytaj wybór
# zagnieżdżony warunek „if-else”.
jeśli [$wybór -równ. 1]; Następnie

echo "Wybrałeś słowo: Bash"

jeśli [$wybór -eq 2]; Następnie
echo "Wybrałeś słowo: Skrypty"
w przeciwnym razie

jeśli [ $wybór -eq 3 ] ; Następnie
echo "Wybrałeś słowo: samouczek"
w przeciwnym razie
echo "Proszę wybrać pomiędzy 1 a 3!"
echo "1. grzmotnąć"
echo"2. Skrypty »
echo "3. Instruktaż"
echo -n "Proszę wybrać słowo? »
wybór=4
fi
fi
fi
zrobione

Kod: Zaznacz wszystkie $ ./nested.sh
1. bić
2. Skrypty
3. Samouczek

5

1. bić
2. Skrypty
3. Samouczek
Proszę wybrać słowo
4
Proszę dokonać wyboru pomiędzy 1-3!
1. bić
2. Skrypty
3. Samouczek
Proszę wybrać słowo
3
Wybrałeś słowo: Tutorial

Zatem najpierw wykonywana jest treść pętli „while”, ponieważ zmienna wyboru jest początkowo ustawiona na cztery. Następnie wczytujemy do niej dane wejściowe użytkownika, a jeśli dane wejściowe nie są równe 1,2 lub 3, to ponownie ustawiamy naszą zmienną na 4, w związku z czym ciało pętli się powtarza (trzeba ponownie wpisać 1,2 lub 3).

10. Porównania
10.1 Porównania arytmetyczne

porucznik<
-gt>
-le<=
-ge >=
-równ. ==
-nie !=

#!/bin/bash

LICZBA1=2
LICZBA2=2
if [ $LICZBA1 -eq $LICZBA2 ]; Następnie
echo "Obie wartości są równe"
w przeciwnym razie
echo "Wartości NIE są równe"
fi

Kod: Zaznacz wszystkie $ ./equals.sh
Obie wartości są równe

#!/bin/bash
# Deklaruj zmienne o wartościach całkowitych
LICZBA1=2
LICZBA2=3
if [ $LICZBA1 -eq $LICZBA2 ]; Następnie
echo "Obie wartości są równe"
w przeciwnym razie
echo "Wartości NIE są równe"
fi

Kod: Zaznacz wszystkie $ ./equals.sh
Wartości NIE są równe

#!/bin/bash
# Deklaruj zmienne o wartościach całkowitych
LICZBA1=2
LICZ2=1
if [ $LICZBA1 -eq $LICZBA2 ]; Następnie
echo "Obie wartości są równe"
elif [ $LICZBA1 -gt $LICZ2 ]; Następnie
echo "$NUM1 jest większe niż $NUM2"
w przeciwnym razie
echo "$NUM2 jest większe niż $NUM1"
fi

Kod: Zaznacz wszystkie $ ./equals.sh
2 jest większe niż 1

10.2 Porównania znaków i tekstu

Ten sam
!= nie to samo
< меньще чем
> więcej niż
-n s1 zmienna s1 nie jest pusta
-z s1 zmienna s1 jest pusta

#!/bin/bash

S1="Bash"

S2="Skrypty"
jeśli [ $S1 = $S2 ]; Następnie

w przeciwnym razie
echo „Ciągi NIE są równe”
fi

Kod: Zaznacz wszystkie $ ./statement.sh
Ciągi NIE są równe

#!/bin/bash
# Zadeklaruj zmienną symboliczną S1
S1="Bash"
# Zadeklaruj zmienną symboliczną S2
S2="Bash"
jeśli [ $S1 = $S2 ]; Następnie
echo „Oba łańcuchy są równe”
w przeciwnym razie
echo „Ciągi NIE są równe”
fi

Kod: Zaznacz wszystkie $ ./statement.sh
Oba ciągi są równe

11. Sprawdzanie plików

B nazwa pliku Specjalny plik bloku
-c nazwa pliku Plik ze znakami specjalnymi
-d nazwa_katalogu Sprawdź istnienie katalogu
-e nazwa pliku Sprawdź istnienie pliku
-f nazwa_pliku Sprawdź, czy istnieje normalny plik, a nie katalog
-G nazwa_pliku Sprawdź, czy plik istnieje i czy jego właścicielem jest efektywny identyfikator grupy.
-g nazwa_pliku prawda, jeśli plik istnieje i jest ustawiony na identyfikator grupy.
-k nazwa pliku Lepki bit
-L nazwa pliku Dowiązanie symboliczne
-O nazwa_pliku Prawda, jeśli plik istnieje i jest własnością efektywnego identyfikatora użytkownika.
-r nazwa pliku Sprawdź, czy plik jest czytelny
-S nazwa pliku Sprawdź, czy plik jest gniazdem
-s nazwa_pliku Sprawdź, czy plik ma niezerowy rozmiar
-u nazwa_pliku Sprawdź, czy ustawiony jest bit set-ser-id pliku
-w nazwa_pliku Sprawdź, czy plik jest zapisywalny
-x nazwa pliku Sprawdź, czy plik jest wykonywalny

#!/bin/bash
plik="./plik"
if [-e plik $]; Następnie
echo "Plik istnieje"
w przeciwnym razie
echo "Plik nie istnieje"
fi

Kod: Zaznacz wszystkie $ ls
plik.sh
$ ./plik.sh
Plik nie istnieje
$ plik dotykowy
$ls
plik plik.sh
$ ./plik.sh
plik istnieje

Podobnie w przykładzie możemy użyć pętli „while”, aby sprawdzić, czy plik nie istnieje. Ten skrypt będzie uśpiony, dopóki plik nie będzie istniał. Zwróć uwagę na negatyw Bash „!” co neguje (odwraca) opcję -e.

12. Cykle
12.1. Dla pętli

#!/bin/bash
# dla pętli
dla f w $(ls /var/); Do
echo $f
zrobione

Uruchamianie pętli for z wiersza poleceń bash:

Kod: Zaznacz wszystkie $ dla f w $(ls /var/); wykonaj echo $f; gotowe Kod: Wybierz wszystkie $ dla f w $ (ls / var /); wykonaj echo $f; zrobione
kopie zapasowe
Pamięć podręczna
rozbić się
Gry
lib
lokalny
zamek
dziennik
Poczta
optować
uruchomić
szpula
tmp
www

12.2. pętla while

#!/bin/bash
LICZBA=6
# pętla while
podczas gdy [ $LICZBA -gt 0 ]; Do

niech LICZBA=LICZBA-1
zrobione

Kod: Zaznacz wszystkie $ ./while_loop.sh
Wartość licznika wynosi: 6
Wartość licznika wynosi: 5
Wartość licznika wynosi: 4
Wartość licznika to: 3
Wartość licznika to: 2
Wartość licznika to: 1

12.3. aż do pętli

#!/bin/bash
LICZBA=0
#aż do pętli
do [$LICZBA -gt 5]; Do
echo Wartość licznika to: $COUNT
niech LICZBA=LICZBA+1
zrobione

Kod: Zaznacz wszystkie $ ./until_loop.sh
Wartość licznika to: 0
Wartość licznika to: 1
Wartość licznika to: 2
Wartość licznika to: 3
Wartość licznika wynosi: 4
Wartość licznika wynosi: 5

12.4. Pętle z niejawnymi warunkami
W poniższym przykładzie warunkiem pętli while jest obecność standardowego wejścia.
Ciało pętli będzie działać tak długo, jak długo istnieje coś do przekierowania ze standardowego wyjścia do polecenia odczytu.

#!/bin/bash
# Ten skrypt znajdzie i usunie spacje
# w plikach, zastępując je podkreśleniami
KATALOG="."
Sterowanie pętlą poleceniem read poprzez przekierowanie wyjścia w pętli.
znajdź $DIR -type f | podczas odczytu pliku; Do
# użyj klasy POSIX [:space:], aby znaleźć spacje w nazwach plików
if [[ "$plik" = *[[:spacja:]]* ]]; Następnie
# zamień spacje na podkreślenia
mv "plik $" `echo plik $ | tr ‘ ‘’_’`
fi;
zrobione

Kod: Zaznacz wszystkie $ ls -1
skrypt.sh
$ dotknij „plik ze spacjami”
$ ls -1
plik ze spacjami
skrypt.sh
$ ./script.sh
$ ls -1
plik_z_spacjami
skrypt.sh

13. Funkcje

#!/bin/bash
# Funkcje można deklarować w dowolnej kolejności
funkcja funkcja_B(
echo Funkcja B.
}
funkcja funkcja_A(
powtórz $1
}
funkcja funkcja_D(
echo Funkcja D.
}
funkcja_C(
powtórz $1
}
# Funkcje połączeń
# przekazać parametr do funkcji A
function_A "Funkcja A."
funkcja_B
# przekazać parametr do funkcji funkcji C
function_C "Funkcja C."
funkcja_D

Kod: Zaznacz wszystkie $ ./functions.sh
Funkcja A.
Funkcja B.
Funkcja C.
Funkcja D.

14. Wybierz operatora — Wybierz

#!/bin/bash
PS3='Wybierz jedno słowo:'
# wybierać
wybierz słowo w „linuksie” „bash” „skrypty” „samouczek”
Do
echo "Wybrane słowo to: $słowo"
# Przerwij, inaczej pętla będzie nieskończona.
przerwa
zrobione
wyjście 0

Kod: Zaznacz wszystko $ ./select.sh
1) Linuxa
2) bić
3) skryptowanie
4) samouczek
Wybierz jedno słowo: 4
Wybrane słowo to: tutorial

15. Operator selekcji - przypadek

#!/bin/bash
echo „Jaki jest twój preferowany język programowania/skryptowy”
echo "1) bash"
echo "2) perl"
echo "3) fiton"
echo "4) c++"
echo "5) Nie wiem!"
przeczytaj przypadek;
# prosta struktura wyboru przypadku
# zauważ, że w tym przykładzie $case jest tylko zmienną
# i nie musi się tak nazywać. To tylko przykład
$przypadek
1) echo „Wybrałeś bash”;;
2) echo "Wybrałeś perla";;
3) echo „Wybrałeś fiton”;;
4) echo "Wybrałeś c++";;
5) wyjście
esac

Kod: Zaznacz wszystkie $ ./case.sh
Jaki jest twój preferowany język programowania/skryptów
1) bić
2) perł
3) fiton
4) C++
5) Nie wiem!
4
Wybrałeś C++

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

Bardziej szczegółowe informacje można uzyskać z różnych źródeł, na przykład tutaj
oryginał: 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

Dla napisanie prostego skryptu w bashu musimy wykonać następujące proste kroki:

Jak to wszystko działa:

Pierwsza linia naszego skryptu #!/bin/bash jest niezbędna do pomyślnego działania naszego skryptu.

druga linia mkdir testdir tworzy katalog testdir

trzecia linia cd testdir umożliwia przejście do utworzonego katalogu testdir

zespół dotykać w następnym wierszu dotknij plik1 plik2 plik3 tworzy trzy pliki

a ostatnia komenda w linii naszego skryptu ls -al pozwala nam wyświetlić zawartość bieżącego katalogu, w którym dzięki poprzedniej linii pojawiły się trzy puste pliki.

Jak widać, w naszym prosty skrypt wszystkie polecenia zaczynają się od nowej linii. Każda linia po uruchomieniu skryptu sekwencyjnie wykonuje swoją pracę, wykonując określone czynności.

Jeśli codziennie uruchamiasz łańcuch identycznych poleceń (ze stałymi parametrami) w systemie Linux, sensowne może być napisanie tego samego prosty skrypt w bashu, co pozwoli Ci zaoszczędzić czas i zautomatyzować pracę.

Dzisiaj porozmawiamy o skryptach bash. Są to skrypty wiersza poleceń napisane dla powłoki bash. Istnieją inne powłoki, takie jak zsh, tcsh, ksh, ale skupimy się na bashu. Ten materiał jest przeznaczony dla każdego, jedynym warunkiem jest umiejętność pracy w wierszu poleceń systemu Linux.



Skrypty wiersza poleceń to zestawy tych samych poleceń, które można wprowadzać z klawiatury, zebrane w pliki i połączone wspólnym celem. Jednocześnie wyniki pracy zespołów mogą mieć samodzielną wartość lub służyć innym zespołom. Skrypty to potężny sposób automatyzacji często wykonywanych czynności.

Jeśli więc mówimy o wierszu poleceń, pozwala on wykonać kilka poleceń jednocześnie, wprowadzając je średnikiem:

pwd ; kim jestem
W rzeczywistości, jeśli próbowałeś tego w swoim terminalu, twój pierwszy skrypt bash, który używa dwóch poleceń, został już napisany. To działa tak. Polecenie pwd najpierw wyświetla informacje o bieżącym katalogu roboczym, następnie polecenie whoami wyświetla informacje o użytkowniku, pod którym jesteś zalogowany.

Stosując podobne podejście, możesz łączyć dowolną liczbę poleceń w jednym wierszu, limitem jest tylko maksymalna liczba argumentów, które można przekazać do programu. Możesz zdefiniować ten limit za pomocą następującego polecenia:

Getconf ARG_MAX
Wiersz poleceń to świetne narzędzie, ale musisz wprowadzać do niego polecenia za każdym razem, gdy ich potrzebujesz. Co jeśli zapiszemy zestaw poleceń do pliku i po prostu wywołamy ten plik, aby je wykonać? W rzeczywistości plik, o którym mówimy, nazywa się skryptem wiersza poleceń.

Jak działają skrypty bash

Utwórz pusty plik za pomocą polecenia touch. W pierwszym wierszu musisz określić, której powłoki będziemy używać. Nas interesuje bash , więc pierwsza linia pliku będzie wyglądać następująco:

#!/bin/bash
W innym miejscu tego pliku symbol krzyżyka jest używany do wskazania komentarzy, których powłoka nie przetwarza. Jednak pierwszy wiersz to szczególny przypadek, w którym po znaku krzyżyka następuje wykrzyknik (nazywany shebang) i ścieżka do bash informuje system, że skrypt został napisany specjalnie dla bash .

Polecenia powłoki są oddzielone znakiem nowego wiersza, komentarze są oddzielone znakiem krzyżyka. Oto jak to wygląda:

#!/bin/bash # To jest komentarz pwd whoami
Tutaj, podobnie jak w wierszu poleceń, możesz pisać polecenia w jednym wierszu, oddzielając je średnikiem. Jeśli jednak piszesz polecenia w różnych wierszach, plik jest łatwiejszy do odczytania. W każdym razie powłoka je przetworzy.

Ustawianie uprawnień do pliku skryptu

Zapisz plik, nazywając go myscript , i prawie skończysz ze skryptem bash. Teraz jedyne, co pozostało do zrobienia, to uczynić ten plik wykonywalnym, w przeciwnym razie, gdy spróbujesz go uruchomić, napotkasz błąd Odmowa uprawnień.


Próba uruchomienia pliku skryptu z nieprawidłowo skonfigurowanymi uprawnieniami

Uczyńmy plik wykonywalnym:

Chmod +x ./myscript
Teraz spróbujmy go wykonać:

./myscript
Po ustawieniu uprawnień wszystko działa jak należy.


Pomyślnie uruchom skrypt bash

Wyjście wiadomości

Polecenie echo służy do drukowania tekstu w konsoli Linux. Wykorzystajmy tę wiedzę i edytujmy nasz skrypt, dodając wyjaśnienia do danych, które wyprowadzają polecenia już w nim zawarte:

#!/bin/bash # nasz komentarz jest tutaj echo "Bieżący katalog to:" pwd echo "Zalogowany użytkownik to:" whoami
Oto, co dzieje się po uruchomieniu zaktualizowanego skryptu.


Wyprowadzanie komunikatów ze skryptu

Teraz możemy wyświetlić objaśniające etykiety za pomocą polecenia echo. Jeśli nie wiesz, jak edytować plik za pomocą narzędzi systemu Linux lub nie spotkałeś się wcześniej z poleceniem echo, zapoznaj się z tym artykułem.

Używanie zmiennych

Zmienne umożliwiają przechowywanie informacji w pliku skryptu, na przykład wyników poleceń do wykorzystania przez inne polecenia.

Nie ma nic złego w wykonywaniu poszczególnych poleceń bez zapamiętywania wyników ich pracy, jednak możliwości takiego podejścia są bardzo ograniczone.

Istnieją dwa typy zmiennych, których można używać w skryptach bash:

  • Zmienne środowiska
  • Zmienne użytkownika

Zmienne środowiska

Czasami polecenia powłoki muszą działać z niektórymi danymi systemowymi. Na przykład, oto jak wyświetlić katalog domowy bieżącego użytkownika:

#!/bin/bash # wyświetl użytkownika home echo "Domem bieżącego użytkownika jest: $HOME"
Należy pamiętać, że możemy użyć zmiennej systemowej $HOME w podwójnych cudzysłowach, nie uniemożliwi to rozpoznania jej przez system. Oto, co się stanie, jeśli uruchomisz powyższy skrypt.


Używanie zmiennej środowiskowej w skrypcie

Ale co, jeśli chcesz wyświetlić znak dolara? Spróbujmy tego:

Echo „Mam 1 dolara w kieszeni”
System wykryje znak dolara w łańcuchu rozdzielonym cudzysłowami i założy, że odwołaliśmy się do zmiennej. Skrypt spróbuje wyświetlić wartość niezdefiniowanej zmiennej $1 . To nie jest to, czego potrzebujemy. Co robić?

W takiej sytuacji użycie znaku kontrolnego ukośnika odwrotnego przed znakiem dolara pomaga:

Echo „Mam $1 w kieszeni”
Skrypt wyświetli teraz dokładnie to, czego oczekuje.


Używanie sekwencji ucieczki do wyprowadzenia znaku dolara

Zmienne użytkownika

Oprócz zmiennych środowiskowych skrypty bash umożliwiają ustawianie i używanie własnych zmiennych w skrypcie. Takie zmienne przechowują wartość do momentu zakończenia działania skryptu.

Podobnie jak w przypadku zmiennych systemowych, dostęp do zmiennych użytkownika można uzyskać za pomocą znaku dolara:
TNW-CUS-FMP - kod promocyjny na 10% zniżki na nasze usługi, dostępny do aktywacji w ciągu 7 dni
#!/bin/bash # testowanie zmiennych grade=5 person="Adam" echo "$person to dobry chłopak, jest w klasie $grade"
Oto, co dzieje się po uruchomieniu takiego skryptu.


Zmienne niestandardowe w skrypcie

Zastąpienie polecenia

Jedną z najbardziej użytecznych funkcji skryptów bash jest możliwość wyodrębnienia informacji z danych wyjściowych poleceń i przypisania ich do zmiennych, co pozwala na wykorzystanie tych informacji w dowolnym miejscu pliku skryptu.

Można to zrobić na dwa sposoby.

  • Ze znakiem wstecznego „`”
  • Z konstrukcją $().
Korzystając z pierwszego podejścia, uważaj, aby nie użyć pojedynczego cudzysłowu zamiast znaku wstecznego. Polecenie musi być zawarte w dwóch takich ikonach:

mój katalog=`pwd`
W drugim podejściu to samo jest napisane tak:

mojkatalog=$(pwd)
Ostatecznie skrypt może wyglądać tak:

#!/bin/bash mój katalog=$(pwd) echo $mój katalog
W trakcie swojej pracy dane wyjściowe polecenia pwd zostaną zapisane w zmiennej mydir, której zawartość za pomocą polecenia echo wpadnie do konsoli.


Skrypt, który zapisuje wyniki polecenia w zmiennej

Operacje matematyczne

Aby wykonać operacje matematyczne w pliku skryptu, możesz użyć konstrukcji takiej jak $((a+b)) :

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


Operacje matematyczne w skrypcie

jeśli-to struktura kontrolna

W niektórych scenariuszach wymagane jest kontrolowanie przebiegu wykonywania poleceń. Na przykład, jeśli pewna wartość jest większa niż pięć, należy wykonać jedną akcję, w przeciwnym razie inną. Ma to zastosowanie w wielu sytuacjach, a konstrukcja kontrolna jeśli-to pomoże nam tutaj. W najprostszej postaci wygląda to tak:

Jeśli polecenie to polecenie fi
A oto działający przykład:

#!/bin/bash jeśli pwd to echo "To działa" fi
W takim przypadku, jeśli polecenie pwd zakończy się pomyślnie, na konsoli zostanie wydrukowany tekst „to działa”.

Wykorzystajmy posiadaną wiedzę i napiszmy bardziej złożony scenariusz. Powiedzmy, że chcesz znaleźć użytkownika w /etc/passwd , a jeśli możesz go znaleźć, zgłoś, że istnieje.

#!/bin/bash user=likegeeks if grep $user /etc/passwd then echo „The user $user Exists” fi
Oto, co dzieje się po uruchomieniu tego skryptu.


Wyszukiwanie użytkowników

Tutaj użyliśmy polecenia grep, aby znaleźć użytkownika w pliku /etc/passwd. Jeśli nie znasz polecenia grep, jego opis znajdziesz tutaj.

W tym przykładzie, jeśli użytkownik zostanie znaleziony, skrypt wyświetli odpowiedni komunikat. Co jeśli nie można znaleźć użytkownika? W takim przypadku skrypt po prostu dokończy wykonanie, nic nam nie mówiąc. Chciałbym, żeby nam o tym również powiedział, więc poprawmy kod.

Konstrukcja kontrolna if-then-else

Aby program mógł zgłaszać zarówno wyniki udanego wyszukiwania, jak i niepowodzenia, użyjemy konstrukcji if-then-else. Oto jak to jest skonfigurowane:

jeśli komenda to komenda else komenda fi
Jeśli pierwsze polecenie zwróci zero, co oznacza, że ​​się powiodło, warunek będzie prawdziwy, a wykonanie nie przejdzie w dół gałęzi else. W przeciwnym razie, jeśli zwrócona zostanie wartość inna niż zero, co oznacza niepowodzenie lub fałszywy wynik, zostaną wykonane polecenia następujące po else.

Napiszmy następujący skrypt:

#!/bin/bash user=anotherUser if grep $user /etc/passwd then echo „Użytkownik $user istnieje” else echo „Użytkownik $user nie istnieje” fi
Jego wykonanie przebiegało wzdłuż gałęzi else.


Uruchamianie skryptu z konstrukcją if-then-else

Cóż, przejdźmy dalej i zadajmy sobie pytanie o trudniejsze warunki. Co jeśli musisz sprawdzić nie jeden warunek, ale kilka? Na przykład, jeśli wymagany użytkownik zostanie znaleziony, powinien zostać wyświetlony jeden komunikat, jeśli spełniony jest inny warunek, powinien zostać wyświetlony inny komunikat i tak dalej. W takiej sytuacji pomogą nam zagnieżdżone warunki. To wygląda tak:

Jeśli komenda1 to komenda elif komenda2 to komenda fi
Jeśli pierwsze polecenie zwróci zero, co oznacza sukces, zostaną wykonane polecenia z pierwszego bloku, w przeciwnym razie, jeśli pierwszy warunek jest fałszywy, a drugie polecenie zwróci zero, zostanie wykonany drugi blok kodu.

#!/bin/bash user=anotherUser if grep $user /etc/passwd then echo „Użytkownik $user istnieje” elif ls /home then echo „Użytkownik nie istnieje, ale mimo to istnieje katalog w katalogu /home” fi
W takim skrypcie możesz na przykład utworzyć nowego użytkownika za pomocą polecenia useradd, jeśli wyszukiwanie nie zwróci żadnych wyników, lub zrobić coś innego przydatnego.

Porównanie liczb

W skryptach można porównywać wartości liczbowe. Poniżej znajduje się lista odpowiednich poleceń.
n1 -eq n2 Zwraca wartość true, jeśli n1 jest równe n2.
n1 -gen n2 Zwraca wartość true, jeśli n1 jest większe lub równe n2 .
n1 -gt n2 Zwraca wartość true, jeśli n1 jest większe niż n2 .
n1 -le n2 Zwraca wartość true, jeśli n1 jest mniejsze lub równe n2 .
n1 -lt n2 Zwraca wartość true, jeśli n1 jest mniejsze niż n2.
n1 -ne n2 Zwraca wartość true, jeśli n1 nie jest równe n2.

Jako przykład wypróbujmy jeden z operatorów porównania. Zauważ, że wyrażenie jest ujęte w nawiasy kwadratowe.

#!/bin/bash val1=6 if [ $val1 -gt 5 ] then echo "Wartość testowa $val1 jest większa niż 5" else echo "Wartość testowa $val1 nie jest większa niż 5" fi
Oto, co wyświetli to polecenie.


Porównywanie liczb w skryptach

Wartość zmiennej val1 jest większa niż 5, w wyniku czego wykonywana jest gałąź then operatora porównania, aw konsoli wyświetlany jest odpowiedni komunikat.

Porównanie ciągów

Skrypty mogą również porównywać wartości ciągów. Operatory porównania wyglądają dość prosto, ale operatory porównywania ciągów znaków mają pewne cechy szczególne, które omówimy poniżej. Oto lista operatorów.
str1 = str2 Testuje łańcuchy pod kątem równości, zwraca true, jeśli łańcuchy są identyczne.
s tr1 != str2 Zwraca true, jeśli łańcuchy nie są identyczne.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1 > str2 Zwraca wartość true, jeśli str1 jest większe niż str2 .
-n str1 Zwraca wartość true, jeśli długość str1 jest większa od zera.
-z str1 Zwraca wartość true, jeśli długość str1 wynosi zero.

Oto przykład porównania ciągów znaków w skrypcie:

#!/bin/bash user ="likegeeks" if [$user = $USER] then echo "Użytkownik $user jest aktualnie zalogowanym użytkownikiem" fi
W wyniku wykonania skryptu otrzymujemy co następuje.


Porównanie ciągów znaków w skryptach

Oto jedna cecha porównywania łańcuchów, o której warto wspomnieć. Mianowicie operatory „>” i „<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>' jako polecenie przekierowania wyjścia.

Oto jak wygląda praca z tymi operatorami w kodzie:

#!/bin/bash val1=tekst val2="inny tekst" jeśli [ $val1 \>
Oto wyniki skryptu.


Porównanie ciągów, rzucone ostrzeżenie

Zauważ, że skrypt, chociaż jest wykonywany, wyświetla ostrzeżenie:

./myscript: wiersz 5: [: za dużo argumentów
Aby pozbyć się tego ostrzeżenia, zawiń $val2 w podwójne cytaty:

#!/bin/bash val1=text val2="inny tekst" if [ $val1 \> "$val2" ] then echo "$val1 jest większe niż $val2" else echo "$val1 jest mniejsze niż $val2" fi
Teraz wszystko działa jak należy.


Porównanie ciągów

Kolejna cecha znaków „>” i „<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Jak maniacy lubią maniaków
Zapisz go pod nazwą myfile , a następnie uruchom następujące polecenie w terminalu:

Sortuj mój plik
Posortuje linie z pliku w następujący sposób:

Likegeeks Likegeeks
Polecenie sort domyślnie sortuje łańcuchy w porządku rosnącym, tzn. mała litera w naszym przykładzie jest mniejsza niż wielka litera. Teraz przygotujmy skrypt, który porówna te same napisy:

#!/bin/bash val1=Likegeeks val2=likegeeks if [ $val1 \> $val2 ] then echo "$val1 jest większe niż $val2" else echo "$val1 jest mniejsze niż $val2" fi
Jeśli go uruchomisz, okaże się, że jest odwrotnie - mała litera jest teraz większa niż wielka.


polecenie sortowania i porównanie ciągów w pliku skryptu

W poleceniach porównywania wielkie litery są mniejsze niż małe. Porównanie ciągów odbywa się tutaj poprzez porównanie kodów znaków ASCII, więc kolejność sortowania zależy od kodów znaków.

Polecenie sort z kolei korzysta z porządku sortowania określonego w ustawieniach języka systemu.

Kontrole plików

Być może poniższe polecenia są najczęściej używane w skryptach bash. Pozwalają sprawdzić różne warunki dotyczące plików. Oto lista tych poleceń.
-d plik Sprawdza, czy plik istnieje i czy jest katalogiem.
-e plik Sprawdza, czy plik istnieje.
-f plik Sprawdza, czy plik istnieje i czy jest plikiem.
-r plik Sprawdza, czy plik istnieje i czy można go odczytać.
-s plik Sprawdza, czy plik istnieje i czy nie jest pusty.
-w plik Sprawdza, czy plik istnieje i czy można go zapisywać.
-x plik Sprawdza, czy plik istnieje i czy jest wykonywalny.
plik1 -nt plik2 Sprawdza, czy plik1 jest nowszy niż plik2.
plik1 -ot plik2 Sprawdza, czy plik1 jest starszy niż plik2.
-O plik Sprawdza, czy plik istnieje i czy jest własnością bieżącego użytkownika.
-G plik Sprawdza, czy plik istnieje i czy jego identyfikator grupy odpowiada identyfikatorowi grupy bieżącego użytkownika.

Te polecenia, podobnie jak wiele innych omawianych dzisiaj, są łatwe do zapamiętania. Ich nazwy, będące skrótami różnych słów, bezpośrednio wskazują na przeprowadzane przez nich kontrole.

Wypróbujmy jedno z poleceń w praktyce:

#!/bin/bash mydir=/home/likegeeks if [ -d $mydir ] then echo "Katalog $ mydir istnieje" cd $ mydir ls else echo "Katalog $ mydir nie istnieje" fi
Ten skrypt dla istniejącego katalogu wyświetli jego zawartość.


Wyświetlanie zawartości katalogu

Wierzymy, że z resztą poleceń możesz poeksperymentować samodzielnie, wszystkie działają na tej samej zasadzie.

Wyniki

Dzisiaj rozmawialiśmy o tym, jak zacząć pisać skrypty bash i omówiliśmy kilka podstawowych rzeczy. W rzeczywistości temat programowania w bashu jest ogromny. Ten artykuł jest tłumaczeniem pierwszej części dużej serii 11 materiałów. Jeśli chcesz kontynuować już teraz - oto lista oryginałów tych materiałów. Dla wygody ten, którego tłumaczenie właśnie przeczytałeś, znajduje się tutaj.

Oczywiście wszyscy, którzy przynajmniej raz komunikowali się z systemem Linux, mieli do czynienia (przynajmniej na pewno słyszeli) z powłoką poleceń BASH. Ale BASH to nie tylko powłoka poleceń, to także doskonały skryptowy język programowania.
Celem tego artykułu jest przybliżenie użytkownikom basha, omówienie składni, podstawowych technik i cech języka, aby nawet zwykły użytkownik Udało mi się szybko napisać prosty skrypt do wykonywania codziennej (-tygodniowej, -miesięcznej) rutynowej pracy lub, powiedzmy, „na kolanie”, aby wykonać skrypt do tworzenia kopii zapasowych katalogów.

Wstęp

BASH - Bourne-Again SHell (co można przetłumaczyć jako „odrodzona powłoka” lub „Bourne-Again SHell ponownie”), najpopularniejszy interpreter poleceń w systemach uniksopodobnych, zwłaszcza w GNU/Linux. Poniżej znajduje się kilka wbudowanych poleceń, których użyjemy do stworzenia naszych skryptów.

Wyrwij się dla pętli, podczas lub do
continue wykonuje następną iterację pętli for, while lub till
echo wypisuje argumenty oddzielone spacjami na standardowe wyjście
wyjście z powłoki
export oznacza argumenty jako zmienne, które mają być przekazywane do procesów potomnych w środowisku
hash zapamiętuje pełne nazwy ścieżek poleceń podanych jako argumenty, dzięki czemu nie są one sprawdzane przy następnym wywołaniu
kill wysyła sygnał zakończenia do procesu
pwd wyświetla bieżący katalog roboczy
read czyta wiersz z wejścia powłoki i używa go do przypisania wartości określonym zmiennym.\
return powoduje zakończenie funkcji powłoki z określoną wartością
shift przesuwa parametry pozycyjne w lewo
test ocenia wyrażenie warunkowe
times wypisuje nazwę użytkownika i czas systemowy używany przez powłokę i jej potomków
trap określa polecenia, które mają zostać wykonane, gdy powłoka otrzyma sygnał
unset powoduje zniszczenie zmiennych powłoki
wait czeka na zakończenie procesu potomnego i zgłasza stan wyjścia.

I oczywiście oprócz wbudowanych komend będziemy korzystać z całej masy zewnętrznych, osobnych komend programu, które poznamy już w trakcie.

Co musisz wiedzieć od samego początku

1. Każdy skrypt bash musi zaczynać się od linii:

#!/bin/bash
w tym wierszu po #! ścieżka do interpretera basha jest określona, ​​więc jeśli masz go zainstalowanego gdzie indziej (gdzie, możesz dowiedzieć się, wpisując Whereis bash), zmień go na swoją ścieżkę.
2. Komentarze rozpoczynają się od znaku # (z wyjątkiem pierwszego wiersza).
3. W bashu zmienne nie mają typu (zostaną one omówione poniżej)

Zmienne skryptowe i parametry

Podam mały przykład, który przeanalizujemy:

#!/bin/bash
# określ, gdzie przechowujemy interpreter basha
parametr1=$1 #ustaw zmienną parametr1 na wartość pierwszego parametru skryptu
script_name=$0 #ustaw zmienną script_name na wartość nazwy skryptu
echo "Uruchomiłeś skrypt o nazwie $nazwa_skryptu i parametrze $parametr1" # polecenie echo wyświetla określony ciąg znaków, dostęp do zmiennych uzyskuje się przez $nazwa_zmiennej.
echo "Uruchomiłeś skrypt o nazwie $nazwa_skryptu z parametrem $parametr1" # tutaj widzimy inne cudzysłowy, różnica polega na tym, że nie ma zastępowania zmiennych w pojedynczych cudzysłowach.
exit 0 #Exit z kodem 0 (pomyślne zakończenie skryptu)

[e-mail chroniony]:~$ ./test.sh qwerty
Uruchomiłeś skrypt o nazwie ./test.sh z parametrem qwerty
Uruchomiłeś skrypt o nazwie $nazwa_skryptu i parametrze $parametr1

Teraz, gdy widzieliśmy, jak używać zmiennych i przekazywać parametry do skryptu, nadszedł czas, aby zapoznać się ze zmiennymi zarezerwowanymi:

$DIRSTACK - zawartość górnej części stosu katalogów
$EDYTOR- Edytor tekstu domyślny
$EUID - Efektywny UID. Jeśli używałeś programu su do wykonywania poleceń jako inny użytkownik, to ta zmienna zawiera UID tego użytkownika, podczas gdy...
$UID - ...zawiera prawdziwy dowód osobisty, który jest ustawiany tylko podczas logowania.
$FUNCNAME - nazwa bieżącej funkcji w skrypcie.
$GROUPS - tablica grup, do których należy bieżący użytkownik
$HOME - katalog domowy użytkownika
$HOSTNAME - twoja nazwa hosta
$HOSTTYPE - architektura hosta.
$LC_CTYPE - wewnętrzna zmienna określająca kodowanie znaków
$OLDPWD - stary katalog roboczy
$OSTYPE — typ systemu operacyjnego
$PATH - ścieżka wyszukiwania programu
$PPID - identyfikator procesu nadrzędnego
$SECONDS - czas wykonania skryptu (w sekundach)
$# - całkowita liczba parametrów przekazanych do skryptu
$* - wszystkie argumenty przekazane do skryptu (wyświetlane jako string)
$@ - to samo co poprzednie, ale parametry są wyświetlane w kolumnie
$! - PID ostatniego procesu uruchomionego w tle
$$ - PID samego skryptu

Warunki

Myślę, że operatory warunkowe są znane prawie każdemu, kto kiedykolwiek próbował pisać na czymś programy. W bash warunki są zapisywane w następujący sposób. sposób (jak zwykle w przykładzie):
#!/bin/bash
source=$1 # umieść pierwszy parametr skryptu w zmiennej źródłowej
dest=2$ #wstaw drugi parametr skryptu do zmiennej dest

If [[ "$source" -eq "$dest" ]] # cytuje nazwy zmiennych do porównania. -eq - logiczne porównanie oznaczające "równy"
następnie # jeśli są naprawdę równe, to
echo "Miejsce docelowe $dest i źródło $source to ten sam plik!" #wyświetl komunikat o błędzie, ponieważ $source i $dest są równe
wyjście 1 # wyjście z błędem (1 - kod błędu)
else # jeśli nie są równe
cp $source $dest # następnie wykonaj polecenie cp: skopiuj źródło do miejsca docelowego
echo "Udana kopia!"
fi #oznaczający koniec warunku.

Wynik wykonania skryptu:
[e-mail chroniony]:~$ ./primer2.sh 1 1
Wnioskodawca 1 i źródło 1 to ten sam plik!
[e-mail chroniony]:~$ ./primer2.sh 1 2
Miłego kopiowania!

Struktura if-then-else jest używana w następujący sposób:
Jeśli<команда или набор команд возвращающих код возврата(0 или 1)>
Następnie
<если выражение после if истино, то выполняется этот блок>
w przeciwnym razie
<если выражение после if ложно, тот этот>
Struktury [[ , [ , test, (()) lub dowolne inne (lub kilka) polecenie linuksowe mogą działać jako polecenia zwracające kod powrotu.
test - używany do porównania logicznego. po wyrażeniu wymagany jest nawias zamykający „]”.
[ jest synonimem polecenia testowego
[[ - rozszerzona wersja "[" (od wersji 2.02) (jak w przykładzie), w ramach której || (albo i). Musi mieć nawias zamykający „]]”
(()) - porównanie matematyczne.
zbudować wielopoziomowe warunki postaci:
Jeśli ...
Następnie ....
w przeciwnym razie
Jeśli ....
Następnie....
w przeciwnym razie ....

Dla zwięzłości i czytelności kodu można skorzystać ze struktury:
Jeśli..
Następnie...
Elif...
Następnie...
Elif...

Warunki. Wielokrotny wybór

Jeśli chcesz porównać dowolną zmienną z duża ilość parametrów, bardziej celowe jest użycie instrukcji case.
#!/bin/bash
echo "Wybierz edytor do uruchomienia:"
echo "1 Działa nano"
echo "2 Uruchom program vi"
echo "3 Uruchom program emacs"
echo „4 Wyjście”
czytaj robi #w tym miejscu wczytujemy zmienną $doing ze standardowego wejścia

Sprawa, w której się dzieje
1)
/usr/bin/nano # jeśli $doing wynosi 1, uruchom nano
;;
2)
/usr/bin/vi # jeśli $doing zawiera 2, uruchom vi
;;
3)
/usr/bin/emacs # jeśli $doing zawiera 3, uruchom emacsa
;;
4)
wyjście 0
;;
*) #jeśli z klawiatury wpisuje się coś, co nie jest opisane w przypadku, wykonaj następujące czynności:
echo "Wprowadzono nieprawidłowe działanie"

Esac #end instrukcja sprawy.

Wynik pracy:
[e-mail chroniony]:~$ ./menu2.sh
Wybierz edytor do uruchomienia:
1 Uruchamianie nano
2 Uruchamianie vi
3 Uruchom emacsa
4 Wyjdź

Po wybraniu numeru i naciśnięciu Enter, uruchomiony zostanie wybrany przez Ciebie edytor (o ile oczywiście wszystkie ścieżki są poprawne i masz te edytory zainstalowane :))
Oto lista operatorów logicznych używanych w konstrukcji if-then-else-fi:
-z # linia jest pusta
-n # łańcuch nie jest pusty
=, (==) # łańcuchy są równe
!= # łańcuchy nie są równe
-eq # równa się
-ne # nierówne
-lt,(<) # меньше
-le,(<=) # меньше или равно
-gt,(>) #więcej
-ge,(>=) #większe lub równe
! #negacja wyrażenia logicznego
-a,(&&) #logiczne AND
-o,(||) # logiczne "LUB"

Ustaliliśmy podstawy języka i warunki, aby nie przeciążać artykułu, podzielę go na kilka części (powiedzmy 3). W drugiej części przeanalizujemy operatory pętli i wykonanie operacji matematycznych.

UPD: Naprawiono niektóre błędy
UPD: Zaktualizowano część dotyczącą warunków if-then-else

Wszyscy wiedzą, że powłoka Bash ma wbudowane polecenia, których nie ma w folderach /bin ani /usr/bin. Są wbudowane w powłokę i działają jako funkcje. W jednym z poprzednich artykułów rozważaliśmy. Omówiliśmy tam prawie wszystko, jak powinny wyglądać skrypty, użycie warunków, pętli, zmiennych, ale nie poprzestaliśmy na funkcjach.

W dzisiejszym artykule naprawimy to niedociągnięcie. Jak każdy język programowania, Bash posiada funkcje, które mogą być bardzo przydatne w użyciu. Przyjrzymy się używaniu funkcji basha, sposobom ich pisania, a nawet tworzeniu bibliotek z tych funkcji.

Najpierw musimy zrozumieć, czym jest funkcja w naszym kontekście. Funkcja to zestaw poleceń połączonych jedną nazwą, które wykonują określone zadanie. Funkcja jest wywoływana po imieniu, może przyjmować parametry i zwracać wynik pracy. Krótko mówiąc, funkcje Bash działają tak samo, jak w innych językach programowania.

Składnia tworzenia funkcji jest bardzo prosta:

nazwa_funkcji() ( lista poleceń )

Nazwa funkcji nie może pasować do żadnego z istniejących poleceń lub funkcji, a wszystkie polecenia w treści funkcji są zapisywane w nowym wierszu.

prosta funkcja

Napiszmy małą funkcję, która wyświetli napis na ekranie:

$ vi funkcja.sh

#!/bin/bash
printstr()(
echo "witaj świecie"
}
drukujstr

Dzwonić funkcje basha odbywa się poprzez podanie jego nazwy, tak jak w przypadku każdego innego polecenia. Uruchom nasz skrypt do wykonania, nie zapominaj, że wcześniej musisz nadać mu uprawnienia do wykonania:

chmod u+x funkcja.sh

Wszystko działa, teraz skomplikujmy zadanie, spróbujmy przekazać argumenty do funkcji.

Argumenty funkcji

Argumenty funkcji muszą być przekazywane podczas wywoływania i są odczytywane w taki sam sposób jak argumenty skryptu. Składnia wywołania funkcji z parametrami bash jest następująca:

nazwa_funkcji argument1 argument2 ... argumentN

Jak widać, wszystko jest dość proste. Parametry są oddzielone spacją. Teraz poprawmy naszą funkcję tak, aby wyświetlała określony przez nas ciąg znaków:

!/bin/bash
printstr()(
powtórz $1
}
printstr "Witaj świecie"

Możesz mieć wiele opcji:

!/bin/bash
printstr()(
powtórz $1
powtórz 2 dolary
powtórz 3 dolary
echo 5 dolarów
}
printstr "arg1" "arg2" "arg3" "arg4" "arg5"

Istnieje inny sposób wyodrębniania argumentów, jak w C, przy użyciu stosu. Pobieramy pierwszy argument, następnie przesuwamy wskaźnik stosu argumentów o jeden i ponownie pobieramy pierwszy argument. I tak dalej:

!/bin/bash
printstr()(
powtórz $1
zmiana
powtórz $1
zmiana
powtórz $1
zmiana
powtórz $1
}
printstr "arg1" "arg2" "arg3" "arg4"

Zwracanie wyniku funkcji

Możesz nie tylko używać funkcji z parametrami bash, ale także uzyskać z nich wynik pracy. Służy do tego polecenie return. Kończy działanie funkcji i zwraca wartość liczbową kodu powrotu. Może wynosić od 0 do 255:

!/bin/bash
printstr()(
powrót 134;
}
drukujstr
echo $?

Jeśli chcesz użyć wartości zwracanej przez funkcję bash zamiast kodu statusu, użyj echo. Łańcuch nie jest natychmiast wysyłany do terminala, ale jest zwracany jako wynik funkcji i może zostać zapisany w zmiennej, a następnie użyty:

!/bin/bash
printstr()(
powtórz „test”
}
VAR=$(printstr)
powtórz $VAR

Eksportuj funkcje

Możesz udostępnić funkcję poza skryptem za pomocą polecenia deklarowania:

!/bin/bash
printstr()(
echo "witaj świecie"
}
zadeklaruj -x -f printstr

Następnie uruchom skrypt za pomocą polecenia source:

funkcja źródłowa.sh
$printstr

rekursja

Możesz wywołać funkcję od wewnątrz, aby wykonać rekurencję:

!/bin/bash
printstr()(
echo "witaj świecie"
drukujstr
}
drukujstr

Możesz poeksperymentować z rekurencją, może się to przydać w wielu przypadkach, pamiętaj tylko o pierwszym wywołaniu funkcji Bash.

Zmienne lokalne w funkcji

Jeśli zadeklarujesz zwykłą zmienną w funkcji, będzie ona dostępna w całym skrypcie, jest to wygodne do zwracania wartości funkcji, ale czasami może być konieczne uczynienie jej zmienną lokalną. Jest do tego lokalne polecenie:

!/bin/bash
printstr()(
lokalny VAR=1$
echo $(zmienna)
}
printstr „Witaj świecie”

Biblioteki funkcji

Możemy wziąć niektóre funkcje basha i połączyć je w jedną bibliotekę, abyśmy mogli zaimportować te funkcje za pomocą jednego polecenia. Odbywa się to w sposób podobny do eksportowania funkcji. Najpierw utwórzmy plik biblioteki:

test1()(
echo „Witaj świecie od 1”;
}
test2()(
echo „Witaj świecie od 2”;
}
test3()(
echo "Witaj świecie z 3";
}

Teraz stwórzmy skrypt, który będzie korzystał z naszych funkcji. Możesz zaimportować bibliotekę za pomocą polecenia source lub po prostu określając nazwę skryptu:

!/bin/bash
źródło lib.sh
test1
test2
test3

wnioski

W tym artykule przyjrzeliśmy się funkcjom basha, sposobom ich pisania, stosowania i łączenia w biblioteki. Jeśli często piszesz skrypty w Bash, ta informacja będzie dla Ciebie przydatna. Możesz stworzyć swój własny zestaw funkcji do użycia w każdym skrypcie i tym samym ułatwić sobie pracę.