Bash(ujący) w zbożu cz.1 - Zaczynamy

Bash - zaczynamy

Powłoka bash to jedna z najpopularniejszych powłok systemów uniksowych. Jest też domyślną powłoką w wielu dystrybucjach GNU/Linux a także w systemie macOS. Dostępna jest również w systemie Windows dla środowiska Cygwin i MinGW.

W systemie Windows odpowiednikiem "bash" (może źle to powiedziałem, ale czymś podobnym co wszyscy pewnie znają) jest konsola CMD lub Powershell (o tu już lepiej) w wersjach systemu Windows od XP SP2 i następnych. Tak samo jak w Powershell który, ujednolica zarządzenie systemem i umożliwia wykonanie każdych czynności z poziomu konsoli, bash daje nam takie same możliwości. Czyli kompleksowe zarządzenie systemem z tej powłoki. W zupełności pomijając interfejs graficzny (GUI) a udostępniając nam tekstowy interfejs (CLI)

reklama

Poniższy materiał oprę o dwie dość popularne dystrybucje systemu GNU/Linux takie jak Debian i Ubuntu. Dla mniej doświadczonych użytkowników zaznaczę tylko, że nie wszystkie polecenia opisane (wywołane w skryptach bash) w niniejszym wpisie będą działać w innych dystrybucjach czy innych powłokach. Mogą zwrócić taki sam wynik, błąd lub nie zwrócić nic. Nie będę omawiał tu różnic ani przedstawiał odpowiedników poleceń dla innych dystrybucji czy powłok shell. Zasada działania będzie analogiczna, a różnice będą wynikały tylko ze struktury danej dystrybucji czy powłoki shell. Artykuł tu prezentowany będzie w formie wprowadzenia i uzupełnienia do materiałów na Github.com i YouTube przygotowanych przeze mnie. 

Powyższy pierwszy film to "Witaj świecie" w języku bash. Powinien bez problemu działać w każdym systemie i powłoce shell bez problemu. Hello World choć najprostsze i trywialne pełni często ważną rolę w pierwszych momentach testowania naszego środowiska. 

#!/usr/bin/env bash

#----------------FIRST MESSAGE---------------
echo "Hello World / Witaj świecie"

#----------------Viarable--------------------
MESSAGE="Hello World 2nd / Witaj świecie 2"
echo $MESSAGE

#----------------   END   -------------------

Jeżeli powyższy skrypt bez problemu uruchomisz po przez polecenie bash Helloword.sh znaczy że możesz rozpocząć przygodę związaną z bash

Na rozgrzewkę praktyczne przykłady.

Dla lepszego zrozumienia tego języka skryptowego wykonajmy kilka krótkich zdań. Związanych z wydobyciem pewnych informacji z naszego systemu operacyjnego lub zmuszenie go do pewnych czynności. Do wydobycia informacji wykorzystam polecenia dostępne w danych dystrybucjach czy w samym "Linux".

Lekcja 2.Skrypt który zainstaluje wskazana aplikację, pakiety.

Lekcja 3.

  • Zadanie 1. Informacja po systemie.
  • Zadanie 2. Lista użytkowników.
  • Zadanie 3. Lista grup.
  • Zadanie 4. Lista interfejsów sieci.
  • Zadanie 5. Punkty montowania systemu (df -h), zajętość dysku w %, informacje o dysku.

Tu nie powinno być problemu i polecenia ze skryptu powinny działać w każdej dystrybucji (Debian / Ubuntu). Ćwiczenia wykonać można na maszynie wirtualnej. Będzie to najlepsze rozwiązanie w sytuacji gdy popełnimy jakiś błąd i polecenie uszkodzi nam system. Dzięki migawką w szybki sposób wrócimy do poprzednich ustawień. Jak taką maszynę przygotować na podstawie oprogramowania VirtualBox znajdziesz w poprzednich moich wpisach.

Lekcja 2 - Skrypt który zainstaluje wskazana aplikacje, pakiety

Przyjrzyjmy się pierwszemu zdaniu. Mamy napisać skrypt który wykona nam instalacje pakietu, aplikacji. Zanim przystąpimy do pisania skryptu zastanówmy się jakie polecenia wewnątrz systemu dystrybucji zarządzają pakietami. W przypadku Debian / Ubuntu jest to apt-get bądź aptitude.

Przyjrzyjmy się teraz skryptowi

#!/usr/bin/env bash

# Zmienne
# Variables
currentDate=$(date +"%F") # Data Date
currentTime=$(date +"%T") # Czas Time

# [PL] Funkcje
# [ENG] Functions

function check_install()
{
	# [PL] Funkcja ta sprawdza czy jest zainstalowany pakiet. W przypadku braku pakiety przystepuje do instalacji.
	# [ENG] This function checks if the package is installed. In the absence of packages, it is included in the installation.
    for install in "$@"
    do
        dpkg -s $install &> /dev/null

	    if [ $? -eq 0 ]; then
    	    echo "The $install package is already installed!" |& tee -a log$currentDate.log
	    else
    	    echo "The $install package is not installed, the installation will take place!" |& tee -a log$currentDate.log
		    sudo apt-get install -y $1 |& tee -a log$currentDate.log
	    fi
    done
}

function update_pack()
{
    sudo apt-get update && sudo apt-get upgrade -y |& tee -a log$currentDate.log
}

function main()
{
	# [PL] Instalowanie aktualizacji
	# [ENG] Installing the update
	update_pack

	# [PL] Instalacja usług
	# [ENG] Installation of services
	check_install apache2 php7.0 libapache2-mod-php7.0 mysql-server php7.0-mysql phpmyadmin proftpd openssl
}

# Begin

# [PL]Wywołanie funkcji main.
# [ENG] Calling the main function.
main

# End.

Tak jak wspomniałem na początku. Powłoka bash i skrypty basha są bardzo podobne do skryptów CMD, tak zwanych bat. Czyli w samych skryptach mogę odnosić się do poleceń systemowych. Podaje się je bezpośrednio tak jak byśmy je wpisywali w oknie terminala. Każde polecenie w osobnej linii (Oczywiście istnieje możliwość podania wielu poleceń w jednej linii, ale o tym za później).

W naszym skrypcie pierwsza linia to tak zwana linia shebang która, mówi o tym przez jaki program ma być kod analizowany i wykonywany. W tym przypadku jest to bash. Poniżej mamy dwie zmienne oraz trzy zadeklarowane funkcje. Zmienne przechowują wartości które, w czasie "życia programu" (podczas jego działania) możemy dowolnie zmieniać. Funkcje to takie jakby podprogramy w programie do których możemy się wielokrotnie odwoływać bez konieczności powielania kodu. Co znacząco ułatwia czytelność kodu, powoduje mniej błędów oraz powoduje to, że kod jest tez bardziej modułowy. Łatwo też w nim wprowadzać zmiany.

Kto powiedział że po pierwszym ćwiczeniu z Hello World będzie łatwo :). Czasami by nauczyć się chodzić trzeba pobiec. 

Do edycji lub utworzenia naszego skryptu możemy wykorzystać edytor graficzny w systemie Linux np.: Visual Studio Code lub otworzyć po prostu terminal i wydać polecenie nano -c nazwa_naszego_skryptu.sh. Bardziej zaawansowani użytkownicy na pewno skorzystają z vim. 

Jak zainstalować i skonfigurować Visual Studio Code w systemie Debian przedstawiam na filmie poniżej

nano -c nazwa_naszego_skryptu.sh

Rozszerzenie *.sh nie jest obowiązkowe i jest opcjonalne (łatwiej rozróżnić pliki po rozszerzeniach niż zaglądać do każdego i analizować jakie jest jego zastosowanie). By nasz plik stał się wykonywalny i by można było go uruchomić nadajmy mu odpowiednie uprawnienia po przez polecenie chmod +x nazwa_naszgo_skryptu.sh. Nadamy w ten sposób naszemu plikowi prawa do wykonywania. 

Uruchomienie skryptu po nadaniu odpowiednich praw odbywa się za pomocą wydanego polecenia w postaci ./nazwa_naszego_skryptu.sh. Oczywiście bez nadanych uprawnień na wykonywanie, dalej istnieje możliwość uruchomienia skryptu. Będziemy musieli poprzedzić go poleceniem bash.

./nazwa_naszego_skryptu.sh
# lub / or
bash ./nazwa_naszego_skryptu.sh

Wróćmy jednak do naszego skryptu. Patrząc pewnie na skrypt pierwszy Helloword.sh i Lesson02_solved.sh powoli domyślasz się i na pewno masz racje, że wszystkie linijki zaczynające się od # to komentarze (prócz pierwszej). Zmienne currentDate i currentTime przyjmują wartość bieżącej daty i czasu po przez wywołania polecania systemowego date. Tak w poleceniach shell można odwoływać się do polecenia / programów zainstalowanych w systemie. I gdy tylko zwracają one jakoś "wartość", możemy przypisać ją naszym zmiennym. Tak też się stało w tych dwóch przypadkach.

Spójrzmy teraz na nasze trzy funkcje. Zacznę je omawiać tak trochę na odwrót bo od dołu.

Zacznijmy od funkcji main która ma za zadanie zebranie wszystkich innych funkcji i uruchomienie ich. I tak się dzieje w naszym przypadku uruchamia ona kolejno funkcje update_pack i check_install. Zadaniem funkcji update_pack jest aktualizacja listy pakietów i oprogramowania zainstalowanych w naszym systemie.

Mógłby się ktoś zapytać po co pisać funkcje skoro już są do tego narzędzia?

Wyobraźmy sobie, że nasz skrypt ma 1000 linii kodu. W co dziesiątej chcemy wykonać update i upgrade. Oba polecenia są dosyć długie. Jeżeli chodzi o składnie. Co dodatkowo zwiększyło by wielkość naszego pliku z skryptem. Zastosowanie funkcji powoduje, że za każdym razem nie muszę wydawać długiego polecenia do update i upgrade a jedynie krótkie odwołanie do funkcji update_pack(). Dodatkowo gdy chciałbym by funkcja zapisywała wynik update np.: do pliku tekstowego wystarczy, że zmienię to w funkcji a nie w każdych wystąpieniach naszego polecenia. Gdybym nie korzystał z funkcji poprawki i rozszerzenia kodu były by trudniejsze.

Przejdźmy do naszej głównej funkcji check_install(). Funkcja zawiera pętle for która, odnosi się do zmiennej $@ która, to jest specjalną zmienną przechowującą wszystkie parametry przekazane do funkcji. Sama pętla for operuje na iteracjach. Pewnie domyślasz się już zastosowania. Dokładnie to każdy element zebrany w $@ jest przekazywany do zmiennej install a potem wykonywane są na nim czynności od słowa do do słowa done. A liczba obrotów pętli uzależniona jest od liczby parametrów podanych w wywołaniu funkcji (patrz funkcja main).

Idąc dalej zauważysz dziwne zapisy wykorzystujące znak dolora ($) takie jak na przykład $install. Jest to po prostu wywołanie naszej zmiennej. A zatem dpkg -s $install &> /dev/null sprawdza czy dany pakiet przekazany przez funkcje jest zainstalowany. Swoje informacje przekazuje nie na okno terminala ale na specjalne wirtualne urządzenie jakim jest /dev/null. Po co nam informacje o tym czy pakiet jest zainstalowany czy nie skoro najważniejsza informacja będzie w zmiennej $?. Tak jest to specjalna zmienna która przechorowuje informacje o kodzie wykonania ostatniego polecenia, w tym przypadku jest to dpkg -s $install. I gdy zwróci zero to wszystko jest okej a gdy zwróci rożna od zera to jest błąd. Polecenie dpkg -s $install zwraca tylko 0 gdy aplikacja / pakiet jest zainstalowany u nas w systemie a inny kod gdy nie ma go. Teraz już na pewno wiemy dlaczego korzystamy z konstrukcji if [ $? -eq 0 ]; then - jest to nasza instrukcja warunkowa która, zwraca prawdę gdy nasz zmienna $? zwróci 0 a nie prawdę gdy dowolnie inna liczbę. Do porównywania liczb w bash korzystamy z -eq (ang. equal (pol. równa sie)) Skrypt już robi się znacznie prostszy prawda :). Po więcej zapraszam do lekcji 2 na You Tube - film poniżej.

Lekcja 3. Zadanie 1 - Informacje o systemie.

function mysystem_info()
{
    # Jako ciekawostka możesz zobczyć takie polecia oczywiście bez #
        # cat /etc/issue.net
        # cat /etc/lsb-lsb_release
        # cat /proc/sys/kernel/{ostype,osrelease,version}
        # uname -a | egrep -Eo '#.{1,100}'
        # uname -mrs
    # i kilka innych mozliwości.

    if [ $# -eq 0 ]; then
        echo -e "${BLUE}WARNING - Nie podałeś żadnych argumentów dla funkcji.$NC"
        exit 1
    fi

    for myargs in "$@"
    do
        # Kernel version
        if [ $myargs = 'kernel' ]; then
            echo -e "${GREEN}Twoja wersja karnela to: "$(uname -r)"$NC"
        fi

        # OS type
        if [ $myargs = 'ostype' ]; then
            echo -e "${GREEN}Twój system jest z rodziny: "$(uname -s)"$NC"
        fi

        # Distro version
        if [ $myargs = 'distro' ]; then
            echo -e "${GREEN}Uzywasz dystrybucji: "$(cat /proc/sys/kernel/version)"$NC"
        fi

        # Platform
        if [ $myargs = 'platform' ]; then
            echo -e "${GREEN} Platforma: "$(uname -m)"$NC"
        fi

    done
}

W tym skrypcie nowością jest zmienna $#. Jest to specjalna zmienna która, przechowuje ilość argumentów przekazaną do funkcji / skryptu. A zatem cześć instrukcji if umieszczona po za funkcja sprawdza czy przekazaliśmy jaki kol wiek argument. Jeżeli tak nie jest to przerywa skrypt i wychodzi z niego z kodem 1.

Dalej idąc i patrząc na skrypt mamy pętle for. W pętli za to nowość. Porównanie warunków następuje po przez znak równa się (=). Bash zamienię wykorzystuje znak = i == . Jeżeli masz doświadczenia z innym językiem programowania i zapis = się wygląda dla Ciebie źle, to stosuj == . Jednak pamiętaj, że to to samo w skryptach bash.

Teraz pewnie gdzieś w oddali słyszę,

Jak to przecież równa się jest stosowane do przypisania zmiennych (przykład zmienna="Wartość").

Oczywiście macie racje tylko czy nie zauważyliście czegoś? Pokażę raz jeszcze:

if [ $myargs = 'kernel' ]; then

Dalej nie widać? Podpowiem. To spacje. Dla bash zapis zmienna="Wartość" a $zmienna = "Wartość" to nie to samo.

Warto też wspomnieć, że do porównywania wartości liczbowych stosujemy -eq, -lt, -gt, -le, -ge oraz -ne, co oznacza odpowiednio equal to, less than, greather than, less than or equal to, greather than or equal to oraz not equal to.

Lekcja 3. Zadanie 2 - Lista użytkowników.

function user_list()
{
    if [ $# -lt 1 ]; then
        echo -e "${BLUE}WARNING: Użyj - ${GREEN}$0 ${RED}parametr$NC"
        echo -e "${BLUE}Dostepne parametry to:$NC"
        echo -e "${GREEN}home - ${NC}Zwraca użytkowników z ścieżką /home"
        echo -e "${GREEN}uid - ${NC}Zwraca użytkowników z ścieżką /home"
        echo -e "${GREEN}homeuid - ${NC}Zwraca użytkowników z ścieżką /home"
        echo -e "${GREEN}bash - ${NC}Zwraca użytkowników z ścieżką /home"
    fi

    case "$1" in 
        home)
            echo -e "${GREEN}Lista użytkowników: $NC"
            awk -F: '/\/home/ {printf "%s:%s\n",$1,$3}' /etc/passwd
            ;;
        uid)
            echo -e "${GREEN}Lista użytkowników: $NC"
            awk -F: '($3 >= 1000) {printf "%s:%s\n",$1,$3}' /etc/passwd
            ;;
        homeuid)
            echo -e "${GREEN}Lista użytkowników: $NC"
            awk -F: '/\/home/ && ($3 >= 1000) {printf "%s:%s\n",$1,$3}' /etc/passwd
            ;;
        bash)
            echo -e "${GREEN}Lista użytkowników: $NC"
            cat /etc/passwd | grep "/bin/bash" | cut -d: -f1
            ;;
        *) echo -n "Chcesz wyświetlic listę Użytkoników? [tak czy nie]: "
           read tnie
           case $tnie in
                [tT] | [tT][aA][kK] )
                    echo -e "${GREEN}Lista użytkowników: $NC"
                    cut -d: -f1 /etc/passwd
                    ;;
                nN | [n|N][i|I][e|E] )
                    echo -e "${BLUE}Pa Pa Pa$NC"
                    ;;
           esac
           ;;
    esac
}

Użycie klauzuli case to tak jakby budować warunki w kodzie opierając się o if, elif, else.

Wewnątrz każdej z opcji case jest możliwość zagnieżdżania kolejnych case, if, for a nawet innych zapisów. Nie jest to ograniczone. Musimy jednak pamiętać o składni i bardzo tego pilnować.

Lekcja 3. Zadanie 3 - Lista grup.

function group_list()
{
    case "$1" in
        cut)
            echo -e "${GREEN}Lista grup:$NC"
            cut -d : -f 1 /etc/group
            ;;
        awk)
            echo -e "${GRENN}Lista grup:$NC"
            awk -F ':' '{print $1}' /etc/group
            ;;
        *)
            echo -e "${RED}Nie wyświetle listy grup.$NC"
            ;;
    esac
}

W bash możemy korzystać też z innych poleceń a nawet innych języków interpretowanych służących do przeszukiwania i przetwarzania tekstu takich jak awk.

Lekcja 3. Zadanie 4 - Interfejsy sieciowe.

function net_interfaces()
{
    case "$1" in
        inet)
            echo "Wykaz wszystkich interfejsów sieciowych:"
            ip link show
            ;;
        stat)
            echo "Wykaz interfejsów sieciowych (nazwy) oraz czy jest UP / DOWN:"
            ip -o link show | awk '{print $2,$9}'
            ;;
        iname)
            echo "Wykaz interfejsów sieciowych - same nazwy:"
            ip -o link show | awk -F': ' '{print $2}'
            ;;
        kerneli)
            echo "Lista interfejsów sieciowych widzianych przez Kernel:"
            netstat -i
            ;;
        iaddress)
            echo "Tu wykorzytsanie petli for i nazwa interfejsów z adresami IPv4 i IPv6:" | tee -a Zadanie.txt
            for i in $(ip ntable | grep dev | sort -u | awk '{print $2}'); do echo "Interfejs sieciowy: "$i; ifconfig $i | grep inet | sed -e 's/\<inet\>/IPv4:/g' | sed -e 's/\<inet6\>/IPv6:/g' | awk 'BEGIN{OFS="\t"}{print $1, $2}'; done
            ;;
        ifls)
            echo "Lista podłaczonych urządzeń:"
            ls /sys/class/net
    esac
        
}

Korzystając z rożnych poleceń w bash pamiętaj, że muszą one być wcześniej zainstalowane by otrzymać oczekiwane dane. Dobrym przykładem jest ipconfig wykorzystany w pętli for. W systemie Debian pakiet ipconfig w wersji od 9 wzwyż nie występuje. Należy doinstalować go z pakietu net-tools.

Lekcja 3. Zadanie 5 - Informacje o dysku.

function volume_info()
{
    if [ $# -eq 0 ]; then
        df -h
        exit 0
    fi

    if [ $1 = 'total' ]; then
        df -h --total
    fi
}

Argumenty przekazane w funkcji czy nawet jako parametry w skrypcie mogą być bezpośrednio wykorzystane w instrukcjach warunkowych.

Cały kod lekcji 3.

#!/bin/bash

# Variables / Zmienne
RED="\e[0;31m" # red
GREEN="\e[0;32m" # green
NC="\e[0m" # return to normal color
BLUE="\e[0;34m" # blue

currentDate=$(date +"%F") # Date
currentTime=$(date +"%T") # Time

function mysystem_info()
{
    # Jako ciekawostka możesz zobczyć takie polecia oczywiście bez #
        # cat /etc/issue.net
        # cat /etc/lsb-lsb_release
        # cat /proc/sys/kernel/{ostype,osrelease,version}
        # uname -a | egrep -Eo '#.{1,100}'
        # uname -mrs
    # i kilka innych mozliwości.

    if [ $# -eq 0 ]; then
        echo -e "${BLUE}WARNING - Nie podałeś żadnych argumentów dla funkcji.$NC"
        exit 1
    fi

    for myargs in "$@"
    do
        # Kernel version
        if [ $myargs = 'kernel' ]; then
            echo -e "${GREEN}Twoja wersja karnela to: "$(uname -r)"$NC"
        fi

        # OS type
        if [ $myargs = 'ostype' ]; then
            echo -e "${GREEN}Twój system jest z rodziny: "$(uname -s)"$NC"
        fi

        # Distro version
        if [ $myargs = 'distro' ]; then
            echo -e "${GREEN}Uzywasz dystrybucji: "$(cat /proc/sys/kernel/version)"$NC"
        fi

        # Platform
        if [ $myargs = 'platform' ]; then
            echo -e "${GREEN} Platforma: "$(uname -m)"$NC"
        fi

    done
}

function user_list()
{
    if [ $# -lt 1 ]; then
        echo -e "${BLUE}WARNING: Użyj - ${GREEN}$0 ${RED}parametr$NC"
        echo -e "${BLUE}Dostepne parametry to:$NC"
        echo -e "${GREEN}home - ${NC}Zwraca użytkowników z ścieżką /home"
        echo -e "${GREEN}uid - ${NC}Zwraca użytkowników z ścieżką /home"
        echo -e "${GREEN}homeuid - ${NC}Zwraca użytkowników z ścieżką /home"
        echo -e "${GREEN}bash - ${NC}Zwraca użytkowników z ścieżką /home"
    fi

    case "$1" in 
        home)
            echo -e "${GREEN}Lista użytkowników: $NC"
            awk -F: '/\/home/ {printf "%s:%s\n",$1,$3}' /etc/passwd
            ;;
        uid)
            echo -e "${GREEN}Lista użytkowników: $NC"
            awk -F: '($3 >= 1000) {printf "%s:%s\n",$1,$3}' /etc/passwd
            ;;
        homeuid)
            echo -e "${GREEN}Lista użytkowników: $NC"
            awk -F: '/\/home/ && ($3 >= 1000) {printf "%s:%s\n",$1,$3}' /etc/passwd
            ;;
        bash)
            echo -e "${GREEN}Lista użytkowników: $NC"
            cat /etc/passwd | grep "/bin/bash" | cut -d: -f1
            ;;
        *) echo -n "Chcesz wyświetlic listę Użytkoników? [tak czy nie]: "
           read tnie
           case $tnie in
                [tT] | [tT][aA][kK] )
                    echo -e "${GREEN}Lista użytkowników: $NC"
                    cut -d: -f1 /etc/passwd
                    ;;
                nN | [n|N][i|I][e|E] )
                    echo -e "${BLUE}Pa Pa Pa$NC"
                    ;;
           esac
           ;;
    esac
}

function group_list()
{
    case "$1" in
        cut)
            echo -e "${GREEN}Lista grup:$NC"
            cut -d : -f 1 /etc/group
            ;;
        awk)
            echo -e "${GRENN}Lista grup:$NC"
            awk -F ':' '{print $1}' /etc/group
            ;;
        *)
            echo -e "${RED}Nie wyświetle listy grup.$NC"
            ;;
    esac
}

function net_interfaces()
{
    case "$1" in
        inet)
            echo "Wykaz wszystkich interfejsów sieciowych:"
            ip link show
            ;;
        stat)
            echo "Wykaz interfejsów sieciowych (nazwy) oraz czy jest UP / DOWN:"
            ip -o link show | awk '{print $2,$9}'
            ;;
        iname)
            echo "Wykaz interfejsów sieciowych - same nazwy:"
            ip -o link show | awk -F': ' '{print $2}'
            ;;
        kerneli)
            echo "Lista interfejsów sieciowych widzianych przez Kernel:"
            netstat -i
            ;;
        iaddress)
            echo "Tu wykorzytsanie petli for i nazwa interfejsów z adresami IPv4 i IPv6:" | tee -a Zadanie.txt
            for i in $(ip ntable | grep dev | sort -u | awk '{print $2}'); do echo "Interfejs sieciowy: "$i; ifconfig $i | grep inet | sed -e 's/\<inet\>/IPv4:/g' | sed -e 's/\<inet6\>/IPv6:/g' | awk 'BEGIN{OFS="\t"}{print $1, $2}'; done
            ;;
        ifls)
            echo "Lista podłaczonych urządzeń:"
            ls /sys/class/net
    esac
        
}

function volume_info()
{
    if [ $# -eq 0 ]; then
        df -h
        exit 0
    fi

    if [ $1 = 'total' ]; then
        df -h --total
    fi
}

function main()
{
    #mysystem_info $1
    #user_list $1
    #group_list $1
    #net_interfaces $1
    volume_info $1
}

main $1

Na koniec trochę o wywołaniach zmiennych zapis ${GREEN} a $GREEN jest równoznaczny. Nawiasy klamrowe { i } stosuje się tylko wtedy gdy nasza zmienna po prze wywołanie ma bezpośredni kontakt z innym ciągiem. Co dla interpretera bash może być mylące i tworzyć zmienna o innej nazwie.

Zwracanie wyniku poleceń bezpośrednio do zmiennej lub do innego polecenia (np.: echo) odbywa się po przez $(POLECENIE). Na przykład zmienna=$(NASZE_POLECENIE).

Po więcej szczegółów zapraszam do materiałów na YouTube https://www.youtube.com/channel/UCRMHBbrsyfQEkcXAs7Vr5dg

Bash - automatyzacja zadań.

W kolejnych lekcjach zajmiemy się automatyzacja zadań. Będziemy bazować na poprzednich moich wpisach.

spróbujemy napisać skrypt który, realizuje za nas wszystkie zadania związane z konfiguracją wyżej przedstawionych innych artykułów. Jednak o tym już w następnej części "Bash(ującego) w zbożu". 

Biblioteka

  

linux porady programowanie
reklama

Komentarze