Wyszukiwanie w witrynie

Jak tworzyć proste skrypty powłoki w systemie Linux


Tworzenie skryptów powłoki to jedna z najważniejszych umiejętności, jakie użytkownicy Linuksa powinni posiadać na wyciągnięcie ręki. Skrypty powłoki odgrywają ogromną rolę w automatyzacji powtarzalnych zadań, których wykonywanie wiersz po wierszu byłoby nudne.

W tym samouczku przedstawiamy niektóre podstawowe operacje skryptowe powłoki, które powinien wykonywać każdy użytkownik Linuksa.

1. Utwórz prosty skrypt powłoki

Skrypt powłoki to plik zawierający tekst ASCII. Zaczniemy od stworzenia prostego skryptu powłoki i w tym celu skorzystamy z edytora tekstu. Istnieje sporo edytorów tekstu, zarówno opartych na wierszu poleceń, jak i na graficznym interfejsie użytkownika. W tym przewodniku użyjemy edytora vim.

Zaczniemy od stworzenia prostego skryptu, który po uruchomieniu wyświetli „Hello world”.

vim hello.sh

Wklej następującą zawartość do pliku i zapisz.

#!/bin/bash
Print Hello world message
echo "Hello World!"

Przyjrzyjmy się skryptowi powłoki wiersz po wierszu.

  • Pierwsza linia – #!/bin/bash – nazywana jest nagłówkiem shebang. Jest to specjalna konstrukcja, która wskazuje, jaki program zostanie użyty do interpretacji skryptu. W tym przypadku będzie to powłoka bash wskazywana przez /bin/bash. Istnieją inne języki skryptowe, takie jak Python, który jest oznaczony przez #!/usr/bin/python3 i Perl, którego nagłówek shebang jest oznaczony przez #!/usr/bin/perl.
  • Druga linia to komentarz. Komentarz to instrukcja opisująca, co robi skrypt powłoki i która nie jest wykonywana podczas jego uruchamiania. Komentarze są zawsze poprzedzone znakiem skrótu #.
  • Ostatnia linia to polecenie, które wypisuje na terminalu komunikat „Hello World”.

Następnym krokiem jest uczynienie skryptu wykonywalnym poprzez przypisanie uprawnień do wykonywania za pomocą polecenia chmod, jak pokazano.

chmod +x  hello.sh

Na koniec uruchom skrypt powłoki, używając jednego z poleceń:

bash hello.sh
OR
./hello.sh

2. Używanie instrukcji warunkowych do wykonania kodu

Podobnie jak inne języki programowania, instrukcje warunkowe są używane w skryptach basha do podejmowania decyzji, z niewielkimi różnicami w składni. Omówimy instrukcje warunkowe if, if-else i elif.

Przykład tylko instrukcji if

Instrukcji if można używać do testowania jednego lub wielu warunków. Zaczniemy od podstawowego użycia instrukcji if do testowania pojedynczego warunku. Instrukcja if jest definiowana przez bloki if...fi.

if command
then
  statement
fi

Przyjrzyjmy się poniższemu skryptowi powłoki.

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

Powyższy skrypt powłoki prosi użytkownika o podanie wyniku, który jest następnie przechowywany w zmiennej x. Jeśli wynik odpowiada 70, skrypt zwraca wynik „Dobra robota!”. Operator porównania == służy do sprawdzania, czy wprowadzony wynik, który jest przechowywany w zmiennej x, jest równy 100.

Inne operatory porównania, których możesz użyć, to:

  • -eq – Równe
  • -ne – Nie równe
  • -lt – Mniej niż
  • -le – Mniejszy lub równy
  • -lt – Mniej niż
  • -ge – Większy lub równy

Na przykład poniższy blok instrukcji if wyświetla komunikat „Pracuj ciężej”, jeśli wynik wejściowy ma jakąkolwiek wartość mniejszą niż 50.

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

Przykład instrukcji if-else

W sytuacjach, gdy masz 2 możliwe wyniki: – czy to czy tamto – przydaje się instrukcja if-else.

if command
then
  statement1
else
  statement2
fi

Poniższy skrypt odczytuje wynik wejściowy i sprawdza, czy jest on większy lub równy 70.

Jeśli wynik jest większy lub równy 70, pojawi się komunikat „Świetna robota, zdałeś!”. Jeśli jednak wynik spadnie poniżej 70, zostanie wydrukowany komunikat „Nie udało Ci się”.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo  'You failed'
fi

Przykład instrukcji if-elif-else

W scenariuszach, w których występuje wiele warunków i różne wyniki, używana jest instrukcja if-elif-else. Oświadczenie to ma następującą formę.

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

Na przykład mamy skrypt loterii, który sprawdza, czy wpisana liczba to 90, 60 lub 30.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]];
then
  echo “You have won the First Prize”

elif [[ $x -eq 60 ]];
then
  echo “You have won the Second Prize”

elif [[ $x -eq 30 ]];
then 
  echo “You have won the Second Prize”
else
  echo “Please try again”
fi

3. Używanie instrukcji If z logiką AND

Możesz użyć instrukcji if razem z operatorem logicznym AND, aby wykonać zadanie, jeśli spełnione są dwa warunki. Operator && służy do oznaczenia logiki AND.

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]];
then
  echo “Login successful”
else
  echo “Login failure”
fi

5. Używanie instrukcji If z logiką OR

Używając logiki OR, reprezentowanej przez symbol ||, aby skrypt dał oczekiwane wyniki, musi zostać spełniony którykolwiek z warunków.

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ (number -eq 55 || number -eq 80) ]];
then
 echo 'Congratulations! You’ve won'
else
 echo 'Sorry, try again'
fi

Użyj konstrukcji zapętlających

Pętle Bash pozwalają użytkownikom wykonywać serię zadań, aż do osiągnięcia określonego rezultatu. Przydaje się to przy wykonywaniu powtarzalnych zadań. W tej sekcji przyjrzymy się niektórym pętlom, które można znaleźć także w innych językach programowania.

Podczas pętli

Jest to jedna z najłatwiejszych pętli do pracy. Składnia jest dość prosta:

while  <some test>
do
 commands
done

Poniższa pętla while wyświetla po wykonaniu wszystkie liczby od 1 do 10.

#!/bin/bash
A simple while loop
counter=1
while [ $counter -le 10 ]
 do
echo $counter
 ((counter++))
done

Omówmy pętlę while:

Zmienna licznik jest inicjowana na 1. I chociaż zmienna jest mniejsza lub równa 10, wartość licznika będzie zwiększana, aż warunek zostanie spełniony. Linia echo $counter wypisuje wszystkie liczby od 1 do 10.

Dla pętli

Podobnie jak pętla while, pętla for służy do iteracyjnego wykonywania kodu. Tj. powtórzyć wykonanie kodu tyle razy, ile to możliwe, zdefiniowane przez użytkownika.

Składnia jest następująca:

for var in 1 2 3 4 5 N
do
 command1
 command2
done

Poniższa pętla for iteruje od 1 do 10 i przetwarza ich wartości na ekranie.

Lepszym sposobem osiągnięcia tego jest zdefiniowanie zakresu przy użyciu podwójnych nawiasów klamrowych { , jak pokazano, zamiast wpisywania wszystkich liczb.

#!/bin/bash
Specify range in a for loop

for num in {1..10}
do
  echo $num
done

Parametry pozycyjne Bash

Parametr pozycyjny to specjalna zmienna, do której odwołuje się skrypt, gdy wartości są przekazywane do powłoki, ale nie można jej przypisać. Parametry pozycyjne wahają się od $0 $1 $2 $3 …… do 9 $. Poza wartością $9 parametry muszą być ujęte w nawiasy klamrowe, np. &36 {10}, &36 {11} … i tak dalej.

Podczas wykonywania skryptu pierwszy parametr pozycyjny wynoszący $0 przyjmuje nazwę skryptu powłoki. Parametr $1 przyjmuje pierwszą zmienną przekazywaną do terminala, parametr $2 zajmuje drugą, $3 trzecią i tak dalej.

Utwórzmy skrypt test.sh, jak pokazano.

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

Następnie wykonaj skrypt i jako argumenty podaj imię i drugie imię:

bash test.sh James Kiarie

Z danych wyjściowych wynika, że pierwszą drukowaną zmienną jest nazwa skryptu powłoki, w tym przypadku test.sh. Następnie drukowane są nazwy odpowiadające parametrom pozycyjnym zdefiniowanym w skrypcie powłoki.

Parametry pozycyjne są przydatne, ponieważ pomagają dostosować wprowadzane dane, zamiast jawnie przypisywać wartość do zmiennej.

Kody wyjścia poleceń powłoki

Zacznijmy od odpowiedzi na proste pytanie: Co to jest kod wyjścia?

Każde polecenie wykonane w powłoce przez użytkownika lub skrypt powłoki ma status wyjścia. Status wyjścia jest liczbą całkowitą.

Status wyjścia 0 oznacza, że polecenie zostało wykonane pomyślnie i bez żadnych błędów. Wartość pomiędzy 1 a 255 oznacza, że polecenie nie powiodło się lub nie zostało wykonane pomyślnie.

Aby znaleźć status zakończenia polecenia, użyj zmiennej powłoki $?.

Status wyjścia równy 1 wskazuje na błąd ogólny lub niedopuszczalne błędy, takie jak edycja plików bez uprawnień sudo.

Status wyjścia wynoszący 2 wskazuje na nieprawidłowe użycie polecenia lub wbudowanej zmiennej powłoki.

Status wyjścia 127 wskazuje na nieprawidłowe polecenie, które zwykle powoduje błąd „nie znaleziono polecenia”.

Przetwarzanie danych wyjściowych poleceń powłoki w skrypcie

W skryptach bash możesz przechowywać dane wyjściowe polecenia w zmiennej do wykorzystania w przyszłości. Nazywa się to również podstawieniem poleceń powłoki i można to osiągnąć na następujące sposoby.

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

Na przykład możesz zapisać polecenie data w zmiennej o nazwie dzisiaj i wywołać skrypt powłoki, aby wyświetlić bieżącą datę.

#!/bin/bash

today=$(date)

echo “Today is $today”

Weźmy inny przykład. Załóżmy, że chcesz znaleźć prawidłowych użytkowników logowania w swoim systemie Linux. Jak byś się do tego zabrał? Najpierw lista wszystkich użytkowników (zarówno użytkowników systemowych, procesowych, jak i zalogowanych) jest przechowywana w pliku /etc/passwd.

Aby wyświetlić plik, musisz użyć polecenia cat. Aby jednak zawęzić zakres logowania użytkowników, użyj polecenia grep, aby wyszukać użytkowników z atrybutem /bin/bash i użyj polecenia cut -c 1-10 jako pokazano, aby wyświetlić pierwsze 10 znaków nazw.

Zapisaliśmy polecenie cat w zmiennej login_users.

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:
echo $login_users

Na tym kończy się nasz samouczek dotyczący tworzenia prostych skryptów powłoki. Mamy nadzieję, że uznałeś to za wartościowe.