BASH ściąga #!/bin/bash

 Parametry.

S* – wszystkie parametry począwszy od parametru numer 1
$0 – nazwa programu
$1 – parametr nr 1

$9 – parametr nr 9
$# – liczba parametrów
$$ – numer procesu

Działanie parametrów zilustruje poniższy skrypt:

#!/bin/bash
echo ”nazwa skryptu: $0”
echo ”liczba parametrow: $#”
echo ”wszystkie parametry wywolana: $*”
echo ”parametr pierwszy: $1”
echo ”parametr drugi: $2”
echo ”parametr trzeci: $3”
echo ”numer procesu: $$”

 Instrukcja CASE. 

case $ZMIENNA in
  1) zadanie numer 1;;
  2) zadanie numer 2;;
  *) zadanie w każdym innym przypadku;;
esac

Działanie tej instrukcji obrazuje poniższy skrypt:

#!/bin/bash
case $1 in
piatek) echo “weekend jest juz tuz tuz”;;
sobota) echo “juz weekend”;;
niedziela) echo “weekend się juz powoli konczy”;;
poniedzialek) echo ”już poniedziałek znowu trzeba isc do pracy”;;
*) echo „srodek tygodnia trzeba ciezko pracowac”;;
esac

Instrukcja warunkowa IF.

if warunek; then 
  wyrażenie1; 
  wyrażenie2;
fi

Operatory.

Ponadto bardzo istotne jest także używanie znaków cudzysłowu we wszystkich warunkach w
których operator przyjmuje postać –n

#!/bin/bash

# Porównywanie liczb:
# -eq - liczba1 -eq liczba2: Prawda, gdy liczba1 jest równa liczbie2.
# -ne - liczba1 -ne liczba2: Prawda, gdy liczby są różne.
# -gt - liczba1 -gt liczba2: Prawda, gdy liczba1 jest większa od liczby2.
# -lt - liczba1 -lt liczba2: Prawda, gdy liczba1 jest mniejsza od liczby2.
# -ge - liczba1 -ge liczba2: Prawda, gdy liczba1 jest większa lub równa liczbie2.
# -le - liczba1 -le liczba2: Prawda, gdy liczba1 jest mniejsza lub równa liczbie2.

# Porównywanie tekstów:
# = Porównuje, czy dwa teksty są równe.
# != Sprawdza, czy dwa teksty są różne od siebie.
# -z string Sprawdza, czy długość tekstu jest równa zero (czy tekst jest pusty).
# -n string Sprawdza, czy długość tekstu jest różna od zera (czy tekst nie jest pusty).
# < Sprawdza, czy pierwszy tekst jest leksykograficznie mniejszy od drugiego.
# > Sprawdza, czy pierwszy tekst jest leksykograficznie większy od drugiego.

# Warunki związane z plikami:
# -e plik Sprawdza, czy dany plik istnieje.
# -f plik Sprawdza, czy dany plik istnieje i jest zwykłym plikiem (nie katalogiem ani urządzeniem).
# -d plik Sprawdza, czy dany plik istnieje i jest katalogiem.
# -h plik Sprawdza, czy dany plik istnieje i jest plikiem symbolicznym.
# -s plik Sprawdza, czy dany plik istnieje i jest niepusty (ma zerową długość).
# -c plik Sprawdza, czy dany plik istnieje i jest urządzeniem znakowym.
# -b plik Sprawdza, czy dany plik istnieje i jest urządzeniem blokowym.
# -r plik Sprawdza, czy dany plik jest dostępny do odczytu.
# -w plik Sprawdza, czy dany plik jest dostępny do zapisu.
# -x plik Sprawdza, czy dany plik jest wykonywalny (ma ustawiony bit wykonywalności).
# -ot plik Sprawdza, czy dany plik jest starszy od innego pliku.
# -nt plik Sprawdza, czy dany plik jest młodszy od innego pliku.
# -size n Sprawdza, czy dany plik ma określoną wielkość (n może być wartością w bajtach lub z sufiksem k, M lub G dla kilobajtów, megabajtów lub gigabajtów).
# -L plik Sprawdza, czy dany plik istnieje i jest plikiem symbolicznym.

# Operatory logiczne:
# && (Operator logiczny AND): Operator ten zwraca prawdę (0), jeśli oba warunki, które są po obu jego stronach, są prawdziwe. W przeciwnym razie zwraca fałsz (1).
# || (Operator logiczny OR): Operator ten zwraca prawdę (0), jeśli przynajmniej jeden z dwóch warunków, które są po obu jego stronach, jest prawdziwy. Zwraca fałsz (1), jeśli oba warunki są fałszywe.
# ! (Operator logiczny NOT): Operator ten odwraca wartość logiczną warunku, na którym jest zastosowany. Jeśli warunek jest prawdziwy, ! zwraca fałsz (1), a jeśli warunek jest fałszywy, ! zwraca prawdę (0).


if [ $1 -eq $2 ]; then
echo "liczby $1 i $2 są równe";
else
echo "liczby $1 i $2 są różne";
fi
if [ -e $3 ]; then
echo "plik o nazwie $3 istnieje";
if [ -L $3 ]; then
echo "i jest dowiązaniem symbolicznym";
elif [ -f $3 ]; then
echo "i jest zwykłym plikiem";
fi
else
echo "plik o nazwie $3 nie istnieje"
fi

 Pętle.

Jak wiadomo pętle stosuje się w celu wykonania pewnych instrukcji dla kolejnych iteracji lub
kilku parametrów. W bashu przy tworzeniu skryptów również możemy się posługiwać
pętlami. Do najczęściej stosowanych pętli zalicza się pętle for i while, które zostaną
omówione.

FOR

Składnia pętli for wygląda następująco:
   

for ZMIENNA in …; do
   instrukcje;
done

Przykładem użycia pętli for może być skrypt, który wyświetli, linijka po linijce, wszystkie
parametry, z jakimi ten skrypt został uruchomiony niezależnie od liczby tych parametrów.
Kod takiego skryptu wygląda następująco:

#!/bin/bash
for ZMIENNA in $*; do
echo “$ZMIENNA”;
done

 Oczywiście pętle for można używać na wiele różnych sposobów np.:

#!/bin/bash
DZIEN1=poniedziałek
DZIEN2=wtorek
DZIEN3=środa
for ZMIENNA in ”$DZIEN1” ”$DZIEN2” ”$DZIEN3”; do
echo ”Dzisiaj jest: $ZMIENNA”;
done

 WHILE

Składnia pętli while wygląda następująco:

while warunek; do
instrukcje;
done

W pętli while warunek zbudowany jest dokładnie tak samo jak w instrukcji warunkowej IF (ta sama konstrukcja te same operatory).

 

Pętla while działa tak długo dopóki warunek jest prawdziwy w przeciwnym razie pętla kończy swoje działanie. Do sterowania pętlą while istnieją dwie instrukcje:

• break – przerwanie wykonywania pętli
• continue – wymuszenie kolejnej iteracji pętli

Przykładowy skrypt wykorzystujący pętlę while może wyglądać następująco:

#!/bin/bash

echo "Liczba pierwsza to: $1"
echo "Liczba druga to: $2"
if [ $1 -gt $2 ]
then
        X=$1;
                while [ $X -gt $2 ]; do
                        ROZNICA=$(($X - $2));
                        echo ”liczba $X jest wieksza od liczby $2 o $ROZNICA”;
                        X=$(($X - 1));
                done
else
        echo ”liczba $1 nie jest wieksza od liczby $2”;
fi

 UNTIL

Pętla until ma dokładnie taką samą składnie jak pętla while i działa tak samo jak pętla while z tą różnica, że warunek znajdujący się w pętli until jest zanegowany. Pętla until działa tak długo dopóki warunek jest nieprawdziwy w przeciwnym razie pętla kończy swoje działanie. Zgodnie z tym składnia pętli until wygląda następująco:

until warunek; do instrukcje;

done

Przykładowy skrypt wykorzystujący pętlę while może wyglądać następująco:

#!/bin/bash

# Pętla until służy do wykonywania danego zestawu poleceń, o ile dany warunek ma wartość false.

X=$1
# until [ 2 > 4 ] warunek jest false i pętla się wykona
until [ $X -gt $2 ]
do
        echo "liczba $X jest mniejsza od liczby $2"
        X=$(($X + 1))
done

 Użycie znaków globalnych w pętlach

Wspominając o pętlach, których implementację możemy stosować w skryptach shellowych należy również wspomnieć o znaku ‘*’. Otóż wszystkie parametry zawierające znak ‘*’ zastępowane są listą plików, które pasują do zadanego wzorca (sam znak ‘*’ jest zastępowany listą wszystkich plików znajdujących się w bieżącym katalogu za wyjątkiem plików, których nazwa zaczyna się od kropki).

Zasadę działania znaku ‘*’ zobrazuje poniższy skrypt:

#!/bin/bash
echo "Oto zawartość katalogu ${PWD}: "
echo ${PWD}/*

W wyniku wykonania w/w skryptu zostaną wyświetlony wszystkie pliki znajdujące się w katalogu bieżącym. Oczywiście istnieje również możliwość wykorzystania znaku ‘*’ w zakładaniu tzw. maski:

#!/bin/bash
echo "Oto wykaz wszystkich plików z katalogu ${PWD}, których nazwa zaczyna się na litere a: "
echo ${PWD}/a*

Podstawianie poleceń

Jednym z bardziej przydatnych i wygodnych mechanizmów basha jest możliwość pobierania danych, które zostały otrzymane w wyniku działania jakiegoś polecenia linuxowego i traktowanie ich tak jakby zostały wprowadzone z klawiatury. Mechanizmem tym jest mechanizm podstawiania poleceń.

Istnieją dwa sposoby podstawiania poleceń:

rozwijanie zawartości nawiasów

ujmowanie polecenia w tzw. wsteczne apostrofy.

Rozwijanie zawartości nawiasów odbywa się w następujący sposób: $(polecenie_do_wykonania) – zapis taki zostaje zastąpiony przez wynik wykonania polecenia znajdującego się w nawiasach. Istotny jest fakt, że nawiasy mogą być zagnieżdżone, czyli polecenia również mogą zawierać nawiasy.

Ujmowanie polecenia w tzw. wsteczne apostrofy:

`polecenie_do_wykonania` – zapis taki zostaje zastąpiony przez wynik wykonania polecenia znajdującego się w nawiasach.

Poniżej znajduje się przykład skryptu, który obrazuje zasadę działania mechanizmu podstawiania poleceń:

#!/bin/bash
DANE="$(ls -l)"
        echo "Wynik metody rozwijania zawartosci nawiasow:"
        echo "$DANE" #>> test.txt
# apostrofy wsteczne, znak na klawiatusze pod tyldą ~
# DANE="$(cat test.txt)"
DANE=`cat test.txt`
        echo "Wynik metody ujmowania polecenia w tzw. wsteczne apostrofy:"
        echo "$DANE"

 Operacje arytmetyczne

Omawiając problematykę pisania skryptów działających w powłoce bash należy również wspomnieć o możliwości wykonywania obliczeń arytmetycznych, do których używa się operatora expr odpowiadającego za wykonanie wszystkich operacji. Jego użycie wygląda w następujący sposób:

WYNIK_DZIALANIA=`expr 13 – 7` # za zmienna WYNIK_DZIALANIA zostanie podstawiony wynik odejmowania liczby 7 od liczby 13.

Zapis operacji matematycznych:

a + b odpowiednik `expr a + b` #dodawanie a – b odpowiednik `expr a – b` #odejmowanie a * b odpowiednik `expr a \* b` #mnożenie a / b odpowiednik `expr a / b` #dzielenie

a % b odpowiednik `expr a % b` #reszta z dzielenia a przez b

Przykładowy skrypt wykonujący podstawowe działania matematyczne:

#!/bin/bash
A=$1
B=$2
echo -n "Wynik dodawania liczby $1 do liczby ${2}: "
WYNIK=`expr $A + $B`
echo "$WYNIK"
echo -n "Wynik odejmowania liczby $1 od liczby ${2}: "
WYNIK=`expr $B - $A`
echo "$WYNIK"
echo -n "Wynik mnozenia liczby $1 przez liczbe ${2}: "
WYNIK=`expr $A \* $B`
echo "$WYNIK"
echo -n "Wynik dzielenia liczby $1 przez liczbe ${2}: "
WYNIK=`expr $A / $B`
echo "$WYNIK"
echo -n "Reszta z dzielenia liczby $1 przez liczbe ${2}: "
WYNIK=`expr $A % $B`
echo "$WYNIK"

root@DDemo:~# ./operacje_arytmentyczne.sh 2 2
Wynik dodawania liczby 2 do liczby 2: 4
Wynik odejmowania liczby 2 od liczby 2: 0
Wynik mnozenia liczby 2 przez liczbe 2: 4
Wynik dzielenia liczby 2 przez liczbe 2: 1
Reszta z dzielenia liczby 2 przez liczbe 2: 0
root@DDemo:~#

 Funkcje

Pisząc skrypty w bashu programista może również tworzyć funkcje, które w bardzo dużej mierze przyczyniają się do skrócenia kodu skryptu i zwiększają jego przejrzystość.

Ogólna postać funkcji wygląda następująco:

nazwa_funkcji() {

instrukcje do wykonania }

Przykładową funkcję można zapisać w następujący sposób:

dodawanie() {

WYNIK=$(($1 + $2)) echo”$WYNIK”

}

Utworzoną funkcję wywołuje się podając jej nazwę i jeśli zachodzi taka potrzeba parametry, z jakimi ma zostać ona uruchomiona, np.:

dodawanie 12 69

Podobnie jak w przypadku parametrów skryptu przekazywanych w linii poleceń bezpośrednio po nazwie pliku zawierającego kod skryptu, tak i w przypadku funkcji, parametry funkcji umieszczane są w tablicy $*, a odwoływanie się do poszczególnych parametrów odbywa się poprzez konstrukcję $1, $2, $3 … itd, jednakże parametry te, na czas działania funkcji, zastępują parametry skryptu przekazane w linii poleceń. Po zakończeniu działania funkcji można wykonywać działania na parametrach skryptu, ponieważ wartość tych parametrów nie uległa zmianie.

Wewnątrz funkcji można oczywiście używać wszystkich konstrukcji, które zostały omówione w niniejszym kursie.

Przykładowy skrypt zawierający funkcje wygląda następująco:

#!/bin/bash

dzielenie_liczb()
{
        WYNIK=`expr $1 / $2`
        echo "wynik dzielenia wykonanego przez funkcje wynosi: $WYNIK"
}

WYNIK=`expr $1 / $2`
echo "wynik dzielenia wykonanego poza funkcja (przed jej wykonaniem) wynosi $WYNIK"

dzielenie_liczb 10 5 #wywołanie funkcji wraz z parametrami
WYNIK=`expr $1 / $2`
echo "wynik dzielenia wykonanego poza funkcja (po jej wykonaniu) wynosi $WYNIK"

Funkcje

Wyświetlanie zmiennych środowiskowych (komenda env)

Aby wyświetlić bieżące zmienne środowiskowe, należy użyć komendy env . Zmienna środowiskowa dostępna dla wszystkich procesów jest nazywana zmienną globalną.

Na przykład, aby wyświetlić wszystkie zmienne środowiskowe i ich wartości, wpisz:
root@Wazuh:/etc# env
SHELL=/bin/bash
PWD=/etc
LOGNAME=root
HOME=/root
LANG=pl_PL.UTF-8
TERM=xterm-256color
USER=root
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAIL=/var/mail/root
_=/usr/bin/env
OLDPWD=/etc/wazuh-dashboard
root@Wazuh:/etc#