Powłoka systemowa (ang. shell) – program komputerowy pełniący rolę pośrednika pomiędzy systemem operacyjnym lub aplikacjami a użytkownikiem, przyjmując jego polecenia i „wyprowadzając” wyniki działania programów. To pośrednictwo nie jest obowiązkowe (programy mogą być bardziej „samodzielne”).

Powłoki systemowe możemy podzielić na powłoki tekstowe i powłoki graficzne. Pierwszy ich rodzaj jest zwykle realizowany jako interpreter poleceń uruchamiany w trybie tekstowym i będący historycznie wcześniejszym rozwiązaniem. Powłoka tekstowa często sama zawiera podstawowe polecenia, gdy jednak wydane przez użytkownika polecenie nie jest wbudowane, uruchamiany jest program zewnętrzny. Po zalogowaniu użytkownik znajduje się w wierszu poleceń i może wydawać polecenia systemowi. Zachęca go do tego tzw. znak zachęty (command prompt) – zwykle jest to '>', '$' lub '#'. Natomiast powłoki graficzne mają zwykle postać menedżera plików kontrolowanego przy pomocy myszy i pozwalającego w łatwy sposób wykonywać najczęstsze operacje.

 

Powłoki tekstowe

Powłoki graficzne

 

WSTĘP

Powłoka systemu operacyjnego to program, który komunikuje użytkownika z jądrem systemu; dzieje się to za pomocą wiersza poleceń. Jądro systemu zawiera wszelkie podprogramy, które są potrzebne do przeprowadzania operacji wejścia i wyjścia, zarządzania plikami itp. Powłoka pozwala korzystać z tych podprogramów za pomocą wiersza poleceń czyli służy do  komunikacji miedzy użytkownikiem a jądrem systemu. Poza tym powłoki obsługują także język programowania. Programy pisane w języku powłoki są zwykle nazywane skryptami lub skryptami powłoki. Nie można pracować bezpośrednio z podstawowa częścią systemu linuksowego jaka jest jądro (określa się je tez często nazwa kernel)-niezbędny jest do tego program pośredniczący, czyli właśnie powłoka systemu operacyjnego (lub inaczej interpreter poleceń powłoki). powłoka systemu Linux pełni taka sama funkcje, jak plik command.com w systemie DOS, tyle tylko, ze użytkownik Linuxa może wybrać jedna pośród kilku dostępnych powłok.

Ogólnie powłoki używane są na trzy sposoby:

  1. interaktywnie, kiedy użytkownik wydaje polecenia;
  2. do dostosowania sesji linuksowej do potrzeb użytkownika;
  3. do programowania w języku powłoki

Najczęściej używane powłoki:

  1. /bin/sh - Bourne Shell - jest to przodek wszystkich innych powłok systemów Unix-owych, ale brakuje jej wielu przydatnych możliwości.
  2. /bin/bash - Bourne Again Shell - domyślna powłoka wszystkich systemów linuksowych.
  3. */  bin/sch - C Shell - składnia i konstrukcje używane w tej powłoce są bardzo podobne do znanych z języka C
  4. /bin/tcsh - Enhanced C Shell - jest to bardziej rozbudowana część powłoki C Shell
  5. /bin/ksh - Korn Shell - jest to jedna z popularniejszych powłok uniksowych, ale nie jest ona zwykle używana w powłokach linuksowych.

W momencie logowania, shell musi wiedzieć w jakich katalogach znajdują się polecenia i programy Linuxa i za  określenie tych danych odpowiedzialna jest zmienna Path. W pliku tym znajduje się polecenie export, udostępniające zmienne specjalne w każdej uruchamianej powłoce. Można wyeksportować kilka zmiennych używając jednego polecenia eksport. Plik bash_profile jest plikiem tekstowym i można go konfigurować według swoich potrzeb, np. dodać katalogi do zmiennej PATH, dodać nowe definicje zmiennych. Wprowadzone zmiany uaktywnią się po wylogowaniu się i ponownym zalogowaniu, lub poprzez polecenie .bash_profile. należy pamiętać, że zmienne specjalne w .bash_profile są ważniejsze od tych w pliku .profile.

Następnym plikiem zawsze wykonywanym przy uruchamianiu powłoki jest .bashrc. Linux zawiera ogólny, dla wszystkich użytkowników plik /etc/bashrc, oraz plik .bashrc użytkownika, umieszczony w jego katalogu domowym, jest on wykonywany przy każdym nowym uruchomieniu shella. W pliku użytkownika znajduje się polecenie do wywołania ogólnego /etc/.bashrc Plik ten najczęściej zawiera definicje aliasów i zmienne określające właściwości powłoki, potrzebne wszystkim użytkownikom. Do .bashrc znajdującego się w katalogu, użytkownik może  dodać własne aliasy, polecenia lub definicje. Aby uaktywnić w czasie bieżącej sesji trzeba wykonać polecenie: source .bashrc

Pracując z powłoką użytkownik ma do dyspozycji kilka wspaniałych udogodnień. Wiersz poleceń posiada cechę umożliwiającą uzupełniania nazw plików i poleceń. po wprowadzeniu niepełnej nazwy lub polecenia i naciśnięciu klawisza TAB system je uzupełni. Jeżeli istnieje więcej niż jedno polecenie lub plik z tym samym początkiem, użytkownik usłyszy sygnał dźwiękowy, a powłoka poczeka aż   do wprowadzenia więcej znaków, pozwalając jednoznacznie określić polecenie lub nazwę pliku. Oczywiście uzupełnienie nazwy pliku, nastąpi tylko ze znajdujących się w bieżącym katalogu.

Powłoka może również uzupełnić nazwę pliku, wypisując częściowo pasujące pliki w bieżącym katalogu. Po naciśnięciu ESC z następującym po nim znakiem zapytania, zostaną wyświetlone wszystkie nazwy plików pasujące do niepełnej nazwy.

Zmienne Specjalne powłoki BASH - definiowalne:

  • SHELL                      określenie ścieżki do używanego programu powłoki

·         PATH                         lista ścieżek katalogów przeszukiwanych dla znalezienia poleceń do wykonania,

  • PS1                             monit podstawowy,
  • PS2                             monit wtórny,           
  • IFS                              symbol ogranicznika pól,     

·         MAIL                         nazwa pliku poczty, sprawdzanego przez program pocztowy w celu poszukiwania nowych wiadomości,         

  • MAILCHECK          czas między sprawdzeniami nowo otrzymanej poczty,     

·         MAILPATH              lista plików poczty, które mają być sprawdzane w poszukiwaniu nowo otrzymanych wiadomości,

  • TERM                        nazwa terminala,

·         CDPATH                   nazwy ścieżek katalogów przeszukiwanych przez cd w poszukiwaniu katalogów

·         EXINIT                      polecenia inicjacyjne dla edytorów ex/vi,

  • ignoreeof                  zablokowanie wylogowania poprzez CTRL+d,
  • noclobber                 nienadpisywanie plików przez przekierowanie,.

·               noglob                       zablokowanie znaków specjalnych używanych do rozwijania nazw plików: *,?,~,[,].

Najważniejsze polecenia shella

  • adduser nazwa_konta - założenie nowego konta
  • cal - wyświetla kalendarz na bieżący miesiąc
  • cat nazwa_pliku - wyświetla zawartość pliku
  • cd - polecenie analogiczne jak w systemie MS-DOS
  • chmod u/g/o/a +/- r/w/x plik/katalog - polecenie służące do zmiany praw dostępu do plików i katalogów - właściciela określa się za pomocą liter:

Ø  u - właściciel,

Ø  g - grupa,

Ø  o - inni użytkownicy,

Ø  – wszyscy.

Prawa określa się następująco:

Ø  r - zezwolenie na odczyt,

Ø  w - zapis,

Ø  x – uruchomienie.

Innym sposobem ustawiania praw dostępu to ustawianie ich za pomocą liczb ósemkowych. Cyframi od 0-7 ustawiamy odpowiednio:

·        0 to ( --- ) brak praw dostępu

·        1 to ( --x ) wykonywanie

·        2 to ( -w- ) zapis

·        3 to ( -wx ) zapis i wykonywanie

·        4 to ( r-- ) odczyt

·        5 to ( r-x ) odczyt i wykonywanie

·        6 to ( rw- ) odczyt i zapis

·        7 to ( rwx ) odczyt, zapis, wykonywanie wydając polecenie chmod podajemy 3 liczby, które oznaczają w kolejności: prawa dostępu właściciela, grupy i innych.

·         chown nowy_właściciel plik/katalog - polecenie zmiany właściciela pliku lub katalogu

·         chgrp nowa_grupa plik/katalog - polecenie zmiany grupy pliku lub katalogu

·         clear - czyszczenie ekranu  

·         cmp plik1 plik2 - porównuje zawartość dwóch plików  

·         cp - kopiuje pliki i katalogi

·         date - wyświetla bieżącą datę

·         df - sprawdza wolne miejsce na dysku  

·         diff plik1 plik2 - stwierdza, czy między zawartością dwóch plików występują różnice

·         du - informuje o wielkości poszczególnych katalogów  

·         echo - wyświetla podany tekst

·         kill - kończy pracę danego procesu  

·         last nazwa_użytkownika - wyświetla logi użytkownika  

·         ln -s nazwa_katalogu nazwa_łącza - tworzy łącze symboliczne (tzw. link)

·         ls - wyświetla zawartość katalogu

·         mail - wysyła i odbiera pocztę

·         man - pomoc na wszelkie tematy - np.:

·         man ls - pokaże nam pomoc na temat polecenia ls

·         mkdir - tworzenie katalogu  

·         mv - zmiana nazwy pliku lub jego przeniesienie

·         rmdir - usuwanie katalogu

·         passwd nazwa_konta - ustawienie hasła dla konta

·         rm - usunięcie pliku

·         rm -f nazwa_katalogu - usuwanie katalogu wraz z podkatalogami bez potwierdzenia

·         rpm -q | część_nazwy_pakietu - sprawdza czy jest zainstalowany dany pakiet RPM

·         shutdown - restartuje komputer  

·         wall - przesyła komunikaty do wszystkich użytkowników

·         who - lista użytkowników

·         w - jak wyżej, jednak informacje są dokładniejsze

Przejście do wiersza poleceń

Aby w Linuxie wydawać polecenia należy uruchomić interpreter poleceń, czyli powłokę systemu operacyjnego. Można to zrobić na wiele różnych sposobów:

  • -jeśli uruchomiony jest Gnome (czy inne środowisko graficzne)można otworzyć okno terminala,
  • -można uzyskać zdalny dostęp do systemu za pomącą programu telnet,
  • -można uruchomić system w trybie failsafe (tryb ten ma podobną funkcję, jak tryb awaryjny w systemach Windows 95 czy 98), wykorzystując odpowiednią opcję, dostępna w oknie logowania Red Hat,
  • -można również tak skonfigurować system ,by uruchamiał się od razu w trybie tekstowym.

W powłoce Bash wiersz poleceń zaczyna się od znaku zachęty, mającego postać symbolu dolara $ po którym można wprowadzić dowolne polecenie i wcisnąć enter, np. $ logout.  

Uruchamianie interpretera poleceń w oknie terminala

Aby uruchomić interpreter poleceń należy wybrać ikonę terminala z panelu Gnome(wygląda jak monitor i znajduje się na lewo od ikony programu Netscape) lub pozycję Terminal Gnome z menu Programy/System środowiska Gnome. Otwarte zostanie okno terminala.

Uruchamianie komputera w trybie tekstowym

Aby system uruchomił się w trybie tekstowym trzeba się zalogować jako root i uruchomić program Linuxconf. Po wykonaniu tych czynności w oknie Init defaul runlevel należy zaznaczyć opcję Run Level3 i kliknąć przycisk Accept.

POWŁOKA BASH -Bourne Again SHell

Bash to skrót od wyrazów Bourne Again Shell. Powłoka ta jest dostępna za darmo i rozprowadzana zgodnie z warunkami licencji GNU. Jej nazwa odzwierciedla fakt, że początkowo była wzbogaconą wersją powłoki Bourne Shell.

Bash jest domyślną powłoką systemu Red Hat i jest bardzo łatwa w obsłudze.

Interpreter poleceń powłoki BASH

Interpreter poleceń powłoki jest to interfejs pomiędzy użytkownikiem, a jądrem systemu. Dzięki niemu wydane za pomocą klawiatury polecenie zostanie przez  powłokę zmienione na język zrozumiały przez jądro systemu. Jedną z takich powłok jest BASH stworzony przez Briana Foxa i Cheta Rameya. Jest on jedną z lepszych powłok i w wielu systemach linuxowych wykorzystywany jako domyślna. Zawiera 48 wbudowanych poleceń (biult-in) oraz 12 funkcji wywołania. Jest w pełni kompatybilny z powłoką sh oraz zawiera wiele ciekawych rozwiązań przejętych od powłok Korn i C (ksh i csh).

Dokańczanie poleceń

Dokańczanie poleceń jest bardzo wygodną i przyspieszającą pracę opcją powłoki Bash. Dzięki niej nie trzeba wpisywać pełnej nazwy programu (ścieżki do katalogu, pliku itp) lub znać jego dokładnej nazwy. Wystarczy, wpisać jego pierwszą literkę i wciśniemy klawisz TAB. Wtedy Linux spróbuje wyszukać wszystkie dostępne programy, katalogi, pliki, których pierwsza litera nazwy odpowiada wpisanej przez użytkownika. Jeśli więcej programów zaczyna się na tę sam znak powłoka wylistuje ich nazwy i poinformuje za pomocą brzęczyka, że należy podać dodatkowe informacje. Dzieje się to zazwyczaj, po podaniu tylko jednej bądź dwóch pierwszych liter Jeśli wpiszemy nazwę z błędem np. mot, które nie ma odniesienia w rzeczywistości i naciśniemy TAB interpreter poinformuje nas o błędzie wydając z brzęczyka systemowego charakterystyczny dźwięk. Jest to dla nas sygnał, że coś jest nie w porządku i należy poprawić.

Historia poleceń

Bash zapamiętuje wydane przez użytkownika polecenia, dzięki temu za pomocą klawiszy kursora (góra - dół), można szybko przywołać polecenie, które zostało wcześniej wydane. Lista wydanych przez użytkownika poleceń jest ładowana z pliku historii, który domyślnie nosi nazwę .bash_history. Parametry nazwy pliku historii oraz ilości przechowywanych w nim ostatnio wydanych poleceń ustalają zmienne HISTFILE oraz HISTSIZE powłoki. W tym miejscu warto zaznaczyć, że w wielu dystrybucjach Linuxa zmienna HISTSIZE ma wartość 1000 co powoduje, że w pliku .bash_history zapisywanych jest 1000 wydanych ostatnio poleceń. Aby obejrzeć na ekranie dostępne z historii polecenia wystarczy użyć polecenia:

            history liczba.poleceń                   

Użycie skrótu klawiszowego: CTRL+E spowoduje przeskok kursora na koniec wiersza, CTRL+A przeskok na początek wiersza, CTRL+K usunie tekst począwszy od pozycji kursora do końca wiersza, CTRL+Y przywróci usunięty tekst.

Aliasy

Aliasy są to skróty, które przyspieszają  pracę z powłoką.

Warto pamiętać, że utworzone z linii poleceń aliasy stają się nieaktualne po wylogowaniu się z powłoki. Aby były dostępne po każdym zalogowaniu się, należy je dopisać do jednego z plików konfiguracyjnych. Jeśli dany alias nie jest  już potrzebny można usunąć go korzystając z polecenia unalias:

            unalias linux                       

Aby wyświetlić listę wszystkich dostępnych aliasów wystarczy wydać polecenie alias, bez jakichkolwiek parametrów.

Symbole wieloznaczne

Powłoka bash obsługuje trzy rodzaje symboli wieloznaczych. Są to:

·         *, które zastępuje dowolny znak lub ich ciąg,

·         ? - zastępuje dowolny znak (tylko jeden!)

·         [...], które zastępuje dowolny znak występujący pomiędzy nawisami.

Symbole wieloznaczne wykorzystywane są najczęściej do wykonywania tego samego polecenia na różnych plikach, bądź katalogach.

Przekierowanie wejścia i wyjścia

Przekierowanie wejścia służy do podania złożonych danych, które muszą być przekazane do programu. Zazwyczaj wykorzystywane jest to odczytywania danych z plików.

Przekierowanie wyjścia jest częściej używane. Dzięki niemu  można przesłać wyniki pochodzące od programu do pliku lub urządzenia. Jest to potrzebne gdy użytkownik chce zapisać te wyniki do późniejszej analizy itp. Będzie je można  odczytać zwykłym edytorem tekstu.

Istnieje też możliwość dopisywania do oryginalnego pliku. Wtedy jego przednia zawartość zostanie zachowana oraz uzupełniona o nowe dane. Służą do tego znaki: <<.

Potoki

Potoki (pipe) służą do łączenia poleceń. Dzięki temu można przyspieszyć pracę oraz zwiększyć możliwości prostych poleceń. Potoki wykorzystywane są najczęściej w procesach przetwarzania danych np. gdy użytkownik chce wyszukać jakieś konkretne pliki bądź przeglądać logi systemowe, uruchomione procesy itd. Zasada działania potoków polega na tym, że wyście poprzedniego polecenia stanowi wejście następnego. Przykładowo polecenie:

            find /home/artur/Mp3 -name *.mp3 | sort > moje_mp3                    

najpierw wyszuka wszystkie pliki o rozszerzeniu .mp3 w katalogu /home/artur/Mp3, następnie je posortuje (tutaj wykorzystanie potoku), a na końcu wyjście programu sort zostanie skierowane do pliku moje_mp3, który będzie można odczytać zwykłym edytorem.

Zmienne

Zmienne służą do określania konfiguracji powłoki i są one dostępne dla wszystkich procesów potomnych. Wszystkie dostępne zmienne można wylistować poleceniem:

            printenv | more                   

Najbardziej użyteczne zmienne powłoki:

·                  HISTFILE - określa nazwę pliku historii,

·                  HISTSIZE - rozmiar historii,

·                  EDITOR - określa domyślny edytor,

·                  PATH - ścieżka przeszukiwania,

·                  PS1 - znak zachęty pierwszego poziomu,

·                  PS2 - znak zachęty drugiego poziomu,

·                  PWD - określa nazwę bieżącego katalogu,

·                  HOSTNAME - nazwa komputera,

·                  MAIL - ścieżka gdzie przychodzą listy do użytkownika               

 Wszystkie zmienne tracą ważność po wylogowaniu się i  aby były dostępne za każdym razem, trzeba je dodać do plików konfiguracyjnych bash`a.

Znak zachęty

Znak zachęty to tekst, który informuje użytkownika, że system czeka na wprowadzenie przez niego danych. W powłoce bash istnieją dwa poziomy znaku zachęty - pierwszy, który użytkownik otrzymuje zaraz po zalogowaniu informujący, że system czeka na wprowadzenie polecenia. Drugi poziom jest wyświetlany gdy interpreter potrzebuje dodatkowych danych, które trzeba wprowadzić. Jest on przechowywany w zmiennej PS2  i standardowo ma postać ">".

Oto lista kodów specjalnych, które mogą zostać użyte do konfiguracji znaku zachęty:

·                      \! - wyświetla numer polecenia historii,

·                      \# - wyświetla numer aktualnego polecenia,

·                      \$ - wyświetla # dla root`a i $ dla zwykłego użytkownika

·                      \\ - wyświetla znak \

·                      \d - wyświetla datę

·                      \t - wyświetla czas

·                      \h - wyświetla nazwę komputera

·                      \n - przechodzi do nowego

·                      \nnn - wyświetla znak, który odpowiada wartości ósemkowej

·                      nnn \s - wyświetla nazwę powłoki

·                      \u - wyświetla login użytkownika

·                      \W - wyświetla podstawową nazwę bieżącego katalogu

·                      \w - wyświetla nazwę bieżącego katalogu  

Ścieżki przeszukiwania

Ścieżki przeszukiwania są określone zmienną PATH i służą do wyszukania w określonej lokalizacji programu bądź polecenia. Dzięki tym ścieżką zamiast wpisywać /usr/bin/mutt by uruchomić program, wystarczy podać mutt i klient pocztowy zostanie uruchomiony.  W zmiennej PATH musi być podana ścieżka /usr/bin.

Konfiguracja powłoki

Do tej pory wszelkie ustawienia dokonywane na powłoce stawały się nieaktualne po wylogowaniu. Można jednak ustawić je w plikach konfiguracyjnych tak by były odczytywane podczas każdego uruchamiania powłoki (logowania). W przypadku powłoki bash zmienne można umieścić (zapewne są już tam umieszczone) w plikach /etc/profile, gdy jesteśmy administratorem lub w katalogu użytkownika w pliku o nazwie .profile lub .bash_profile. Właśnie w nich dostępne są aliasy, zmienne, ścieżki itp.  

Pisanie skryptów w Bash-u.

Wstęp

Czasem zdarza się taka sytuacja, że użytkownik wykonuje jakąś serię poleceń, musi dodać jakiś warunek lub pętlę do tej serii poleceń. Można to oczywiście napisać w języku programowania jak C, ale trzeba ten język znać. Zamiast tego wszystkie shelle oferują rodzaj języka skryptowego. Za jego pomocą można pisać różne rodzaje skryptów: od tych prostych, które ograniczają się do wykonania serii poleceń, do bardzo skomplikowanych, zawierających różne pętle, warunki itp.

Podstawy

Skrypty można pisać we wszelkiego rodzaju edytorach tekstu. Jest to zwykły plik tekstowy, ale zawierający w pierwszej linijce "#!/bin/bash". Kolejne programy wywołuje się przez wpisanie ich kolejno do tego pliku. Można też wpisać je po kilka w linijce, ale odseparowane średnikami (';'). Aby taki skrypt można było uruchomić, należy nadać mu atrybut wykonywalności, np. poleceniem

chmod +x skrypt

Tak przygotowany skrypt uruchamia się jak każdy inny program. Skrypt można też uruchomić bez nadawania mu bitu wykonywalności czy wpisywania nagłówka:

/bin/bash nazwa_skryptu.

Zmienne

W skryptach powłoki można definiować tzw. zmienne, czyli wartości przypisane do nazwy. Zmienne definiuje się tak:

ZMIENNA=123

ZMIENNA="wartość tekstowa"

Przypisanie do zmiennej wartości tekstowej tak jak powyżej będzie powodowało "rozwijanie" zmiennych. Oznacza to, że jeśli między cudzysłowy użytkownik wpisze zmienną w postaci $ZMIENNA1, to zmienna, do której chcemy to przypisać, będzie zawierała wartość zmiennej ZMIENNA1

Bash oferuje sporo pre-definiowanych zmiennych. Oto ich skrócona lista:

·         $0 - ścieżka do skryptu - dokładnie taka, z jaką wywołano ten skrypt. Może być to 'skrypt' lub '/usr/bin/skrypt'.

·         $1, $2... - zmienne, które zawierają wartość kolejnych parametrów podanych do skryptu.

·         $# - liczba argumentów skryptu

·         $* - wszystkie parametry wywołania skryptu oddzielone pierwszym znakiem wartości zmiennej IFS. Jeśli ta zmienna nie jest ustawiona, parametry separowane są spacjami.

·         $$ - numer procesu (PID) aktualnej powłoki.

·         $! - numer procesu ostatnio puszczonego w tło.

Przy przypisywaniu wartości do zmiennych lub uruchamianiu programów warto jest wiedzieć, że niektóre znaki muszą być "escape'owane" aby nie były interpretowane przez powłokę. Są to znaki, które mają specjalne funkcje: *, !, %, $, <, >, \, # i ". Przez "escape'owanie" rozumie się poprzedzenie danego znaku znakiem "\".

Instrukcje warunkowe

Najprostszym rodzajem warunku jest: jeśli pierwszy program zwrócił 0 wykonaj program 2, lub odwrotnie: jeśli pierwszy program zwrócił wartość różną od zera wykonaj program 2. Wykonanie czegoś takiego jest banalnie proste. W skrypcie, który zawiera taką linijkę:

program1&&program2

program2 będzie uruchomiony, jeśli program1 zwróci 0, natomiast w przypadku wpisania

program1||program2

program2 będzie uruchomiony, jeśli program1 zwrócił wartość różną od zera. Można łączyć te dwie formy, na przykład:

cat plik | grep -q aaa && echo "Znaleziono" || echo "Nie znaleziono"

wyświetli "Znaleziono" jeśli w pliku plik znaleziono "aaa" lub w przeciwnym przypadku "Nie znaleziono".

Przy takiej składni polecenia można grupować obejmując grupy poleceń oddzielone średnikami w nawiasy klamrowe. UWAGA: po klamrze otwierającej i przed zamykającą musi być spacja, a po ostatnim poleceniu także musi być średnik. Grupy poleceń można też ująć w zwykłe nawiasy, ale w tym przypadku tworzona jest nowa powłoka dla tych poleceń.

Składnia jest dosyć podobna do większości języków programowania oprócz jednego elementu: sprawdzania warunku. Otóż bash nie ma sam w sobie mechanizmu warunków, np. x>2. Można do tego użyć polecenia test, które można też wywołać przez umieszczenie parametrów dla tego polecenia w nawiasach kwadratowych, np.:

if [ -n $ZMIENNA ] then...

UWAGA: po nawiasie otwierającym i przed zamykającym musi być spacja.

Ważniejsze opcje:

·           -d plik - prawda, jeśli plik istnieje i jest katalogiem

·           -e plik - prawda, jeśli plik istnieje

·           -f plik - prawda, jeśli plik istnieje i jest zwykłym plikiem

·           -g plik - prawda, jeśli plik istnieje i ma ustawiony bit set-group-id

·           -L plik - prawda, jeśli plik istnieje i jest dowiązaniem symbolicznym

·           -r plik - prawda, jeśli plik istnieje i można go czytać

·           -s plik - prawda, jeśli plik istnieje i ma rozmiar większy od zera

·           -u plik - prawda, jeśli plik istnieje i ma ustawiony bit set-user-id

·           -w plik - prawda, jeśli plik istnieje i można do niego pisać

·           -x plik - prawda, jeśli plik istnieje i można go wykonać

·           plik1 -nt plik2 - prawda, jeśli plik1 jest nowszy (zgodnie z datą modyfikacji) niż plik2

·           plik1 -ot plik2 - prawda, jeśli plik1 jest starszy niż plik2

·           plik1 -ef plik2 - prawda, jeśli plik1 i plik2 mają te same numery urządzenia i i-węzła.

·           -z ciąg - prawda, jeśli ciąg ma długość równą zero

·           -n ciąg - prawda, jeśli ciąg ma długość większość od zera

·           ciąg1 = ciąg2 - prawda, jeśli ciągi są jednakowe

·           ciąg1 != ciąg2 - prawda, jeśli ciągi są różne

·           ! wyrażenie - prawda, jeśli wyrażenie jest fałszywe

·           wyrażenie -a wyrażenie - prawda, jeśli oba wyrażenia są prawdziwe (operator logiczny AND)

·           wyrażenie -o wyrażenie - prawda, jeśli przynajmniej jedno z wyrażeń jest prawdziwe (operator logiczny OR)

·           argument1 -eq argument2 - prawda, jeśli argument1 jest równy argument2

·           argument1 -ne argument2 - prawda, jeśli argument1 nie jest równy argument2

·           argument1 -lt argument2 - prawda, jeśli argument1 jest mniejszy niż argument2

·           argument1 -le argument2 - prawda, jeśli argument1 jest mniejszy bądź równy niż argument2

·           argument1 -gt argument2 - prawda, jeśli argument1 jest większy niż argument2

·           argument1 -ge argument2 - prawda, jeśli argument1 jest większy bądź równy niż argument2

Inną instrukcją warunkową jest struktura case ... in.

Struktura ta jest o wiele wygodniejsza, niż seria warunków if. Bash próbuje porównać zawartość zmiennej z każdym z przypadków - w tym przypadku "ccc", "aaa" i "bbb". Znacznik "*" oznacza wartość domyślną - instrukcje zawarte po tym znaczniku będą wykonywane jeśli nie dopasowano zmiennej do żadnego z wcześniejszych znaczników. Po każdej serii instrukcji znajdują się znaki ";;" - jest to niezbędne, gdyż w wypadku pominięcia ich wykonywane byłyby wszystkie instrukcje. Po dojściu do ";;" bash pomija resztę struktury.

Pętle

Pętle również mają podobną składnie jak popularne języki programowania, lecz pętla for ma trochę inną funkcjonalność.  W większości języków programowania pętla ta działa tak, że podaje się jej 2 liczby: początkową i końcową, i pętla jest wykonywana dopóki jakaś zmienna nie osiągnie wartości końcowej. W bashu wygląda to trochę inaczej. Pętla wykonywana jest dla każdej linijki, którą zwróci podany program. Typowa składnia pętli for wygląda tak:

for i in test; do

instrukcja1

instrukcja2

done

Funkcje

Tak jak w większości "zwykłych" języków programowania, w bashu także można definiować funkcje - zbiory instrukcji, które często się powtarzają w programie. Zamiast wielokrotnie wstawiać zestawy instrukcji można wcześniej zdefiniować taką funkcję i później już tylko wstawiać wywołanie funkcji. Funkcję definiuje się mniej więcej tak:

function nazwa_funkcji

{

instrukcja1

instrukcja2

}

Później do funkcji można się odwołać przez:

nazwa_funkcji parametr1 parametr2

Wewnątrz funkcji parametry są widoczne jako zmienne $1, $2 itp.

Wczytywanie danych

Często potrzebne jest pobranie czegoś z klawiatury. Przydatne do tego jest polecenie read. Można je wykorzystać na kilka sposobów.

·            read - wczytuje linie ze standardowego wejścia i wysyła je do zmiennej $REPLY.

·            read ZMIENNA - wczytuje linie ze standardowego wejścia i wysyła je do zmiennej $ZMIENNA

·            read ZM1 ZM2 ZM2- wczytuje linie ze standardowego wejścia i wysyła je do kolejnych zmiennych (jedna linia w jednej zmiennej)

Aby przetwarzać np. kolejne linie z pliku należy użyć takiej składni:

while read < plik; do ...

wtedy każda linijka będzie dostępna w zmiennej $REPLY.

Debuggowanie

 Jest tylko jedna metoda debugowania. Wystarczy wpisać polecenie set -x na początku skryptu a będzie wypisywane każde wydawane polecenie ze skryptu.

Przydatne polecenia

Istnieje wiele przydatnych poleceń, które można wykorzystać przy pisaniu skryptów. Wymienię tu niektóre z nich.

·            cat - wyświetla plik. Opcje: -n - numeruje linie, -s - usuwa powtarzające się linie.

·            tac - cat w odwrotnej kolejności.

·            sum, cksum, md5sum - wyliczanie sumy kontrolnej pliku.

·            split - dzieli plik na kawałki o zadanej wielkości.

·            csplit - dzieli plik na części oddzielone wzorami określonymi przez użytkownika.

·            expand - konwertuje znaki tabulacji na spacje.

·            fmt - formatuje tekst.

·            logname - wyświetla nazwę użytkownika, jako który skrypt pracuje.

·            id - wyświetla dokładne informacje na temat użytkownika i grupy, jako które skrypt pracuje.

·            nl - czyta dane ze standardowego wejścia i na standardowe wyjście wyświetla te dane z numerowaniem linii.

·            hexdump - wyświetla otrzymane dane w postaci szesnastkowej.

·            od - to samo co wyżej, tylko wyświetla w postaci ósemkowej (między innymi - polecam manual)

·            printf - odpowiednik funkcji w C o tej samej nazwie - wyświetlanie danych w różnych formatach.

·            tsort - program do sortowania topologicznego, cokolwiek by to znaczyło.

·            tee - bardzo przydatny program. Dane, które dostanie na standardowe wejście wysyła ponownie na standardowe wyjście, ale przy okazji zapisuje do podanego pliku.

·            mktemp - program służący do wygenerowania unikalnej nazwy pliku.

·            tr - zamienia jedne literki na inne, np. `tr A-Za-z N-ZA-Mn-za-m` spowoduje zaszyfrowanie tekstu podanego na standardowe wejście systemem ROT13 - jeden z prostszych szyfrów powodujących dodanie 13 do kodu ASCII każdego znaku. tr można też wykorzystać do drobnych poprawek w tekście.

·            cut - kolejny bardzo przydatny program. Służy do obcinania podanych danych o podaną ilość znaków, słów, linii czy innych pól rozgraniczonych podanym znakiem. Np. `cut -f 1 --delimiter=: /etc/passwd` spowoduje wyświetlenie wszystkich nazw użytkowników (i tylko tych nazw) z pliku /etc/passwd.

·            tty - wyświetla nazwę urządzenia - aktualnej konsoli. Przydatne np. do uruchamiania różnych programów w zależności od tego, na której konsoli skrypt jest uruchamiany (np. czy zdalnej, lokalnej, a możne na terminalu szeregowym).

·            wc - program służący do zliczania ilości znaków, słów i linii z podanych danych.

·            sed - to już jest potężne narzędzie. W zasadzie to jest to już język programowania służący do obróbki danych tekstowych. Polecam `man sed`.

·            find - też często się przydaje przy pisaniu skryptów. Jeśli ktoś jeszcze nie wie, to jest to program do wyszukiwania plików o podanych właściwościach. Polecam `man find`, ponieważ jest to program o dużej liczbie opcji.

·            gawk - kolejny język programowania. Sporo potężniejszy od sed'a. Dużo dokumentacji jest w /usr/doc/gawk*/.