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.
- dodawanie skrzynki pocztowe V serwer poczty elektronicznej(dokładniej w bazie danych mysql)
- 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
Kod: Zaznacz wszystko $ ./backup.sh#!/bin/bash
tar -czf mój katalog_domowy.tar.gz /home/user
$ 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.
Kod: Zaznacz wszystkie $ ./hello_world.sh#!/bin/bash
STRING="WITAJ ŚWIECIE!!!"
echo $STRING
WITAJ ŚWIECIE!!!
Nasz skrypt archiwizujący ze zmiennymi:
Kod: Zaznacz wszystko $ ./backup.sh#!/bin/bash
OF=myhome_directory_$(data +%Y%m%d).tar.gz
JEŻELI=/dom/użytkownik
tar -czf $Z $JEŻELI
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
Kod: Zaznacz wszystkie $ ./variables.sh#!/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
zmienna globalna
zmienna lokalna
zmienna globalna
4. Przekazywanie argumentów do skryptu
Kod: Zaznacz wszystko $ ./arguments.sh Samouczek skryptów Bash#!/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: $#’
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
Kod: Zaznacz wszystko $ uname -o#!/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
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ść)
Kod: Zaznacz wszystko $ ./read.sh#!/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):-)"
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
Kod: Zaznacz wszystkie $ ./trap.sh#!/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!!!”
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
Kod: Zaznacz wszystkie $./arrays.sh#!/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
Debian Linux
Linux redhat
ubuntu
Linuks
8.2 Wypełnianie tablicy wartościami z pliku
Kod: zaznacz wszystko $ cat bash.txt#!/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 10letcount=0 podczas czytania LINI<&10; do
TABLICA[$liczba]=$LINIA
((liczba++))
zrobioneecho Liczba elementów: $(#TABLICA[@])
# Wyświetl wartości tablicy
echo $(TABLICA[@])
# zamknij plik
wykonaj 10>&-
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.
Kod: Zaznacz wszystkie $ ./if_else.sh#!/bin/bash
directory="./BashScripting"# sprawdź, czy katalog istnieje
if [-d $katalog]; Następnie
echo "Katalog istnieje"
w przeciwnym razie
echo "Katalog nie istnieje"
fi
Katalog nie istnieje
$ mkdir BashScripting
$ ./if_else.sh
Katalog istnieje
9.2 Zagnieżdżone warunki if-else
Kod: Zaznacz wszystkie $ ./nested.sh#!/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ępnieecho "Wybrałeś słowo: Bash"
jeśli [$wybór -eq 2]; Następnie
echo "Wybrałeś słowo: Skrypty"
w przeciwnym raziejeś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
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 !=
Kod: Zaznacz wszystkie $ ./equals.sh#!/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
Obie wartości są równe
Kod: Zaznacz wszystkie $ ./equals.sh#!/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
Wartości NIE są równe
Kod: Zaznacz wszystkie $ ./equals.sh#!/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
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
Kod: Zaznacz wszystkie $ ./statement.sh#!/bin/bash
S1="Bash"
S2="Skrypty"
jeśli [ $S1 = $S2 ]; Następnie
w przeciwnym razie
echo „Ciągi NIE są równe”
fi
Ciągi NIE są równe
Kod: Zaznacz wszystkie $ ./statement.sh#!/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
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
Kod: Zaznacz wszystkie $ ls#!/bin/bash
plik="./plik"
if [-e plik $]; Następnie
echo "Plik istnieje"
w przeciwnym razie
echo "Plik nie istnieje"
fi
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
Kod: Zaznacz wszystkie $ ./while_loop.sh#!/bin/bash
LICZBA=6
# pętla while
podczas gdy [ $LICZBA -gt 0 ]; Do
niech LICZBA=LICZBA-1
zrobione
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
Kod: Zaznacz wszystkie $ ./until_loop.sh#!/bin/bash
LICZBA=0
#aż do pętli
do [$LICZBA -gt 5]; Do
echo Wartość licznika to: $COUNT
niech LICZBA=LICZBA+1
zrobione
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.
Kod: Zaznacz wszystkie $ ls -1#!/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
skrypt.sh
$ dotknij „plik ze spacjami”
$ ls -1
plik ze spacjami
skrypt.sh
$ ./script.sh
$ ls -1
plik_z_spacjami
skrypt.sh
13. Funkcje
Kod: Zaznacz wszystkie $ ./functions.sh#!/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
Funkcja A.
Funkcja B.
Funkcja C.
Funkcja D.
14. Wybierz operatora — Wybierz
Kod: Zaznacz wszystko $ ./select.sh#!/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
1) Linuxa
2) bić
3) skryptowanie
4) samouczek
Wybierz jedno słowo: 4
Wybrane słowo to: tutorial
15. Operator selekcji - przypadek
Kod: Zaznacz wszystkie $ ./case.sh#!/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
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ą $().
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ę.