bash

uniksowa powłoka systemowa

bashpowłoka systemowa UNIX napisana dla projektu GNU. Program jest rozprowadzany na licencji GPL.

bash
logo
Ilustracja
Interfejs programu
Autor Chet Ramey
Aktualna wersja stabilna 5.2.37
(23 września 2024) [±]
System operacyjny GNU
Rodzaj Powłoka systemowa
Licencja GNU GPL
Strona internetowa

Bash to jedna z najpopularniejszych powłok systemów uniksowych. Jest domyślną powłoką w większości dystrybucji systemu GNU/Linux oraz w systemie macOS od wersji 10.3 do 10.14[1], istnieją także wersje dla większości systemów uniksowych. Bash jest także domyślną powłoką w środowisku Cygwin i MinGW dla systemów Win32.

Bash pozwala na pracę w trybie konwersacyjnym i w trybie wsadowym. Język basha umożliwia definiowanie aliasów, funkcji, zawiera konstrukcje sterujące przepływem (if, while, for, ...). Powłoka systemowa zachowuje historię wykonywanych poleceń i zapisuje ją domyślnie w pliku .bash_history w katalogu domowym użytkownika.

Historia

edytuj

Nazwa jest akronimem od Bourne-Again Shell (angielska gra słów: fonetycznie brzmi tak samo, jak born again shell, czyli odrodzona powłoka). Wywodzi się od powłoki Bourne’a sh, która była jedną z pierwszych i najważniejszych powłok systemu UNIX oraz zawiera pomysły zawarte w powłokach Korna i csh. Bash był pisany głównie przez Briana Foksa i Cheta Rameya w 1987 roku.

Język powłoki bash

edytuj
 
Zrzut ekranu sesji Bash 3.1 przedstawiający jej specyfikę

Najciekawsze możliwości

edytuj

Język powłoki bash jest rozszerzeniem powłoki sh. Większość skryptów przeznaczonych dla powłoki sh działa bez zmian w powłoce bash, wyjątkami są skrypty, które odwołują się do wbudowanych zmiennych powłoki Bourne’a lub używają wbudowanych poleceń tej powłoki. Składnia poleceń powłoki bash zawiera idee pochodzące z powłoki Korna i csh takie jak edycja linii poleceń (ang. command-line editing), historia poleceń, stos katalogów, zmienne $RANDOM i $PPID oraz POSIX-owe podstawianie polecenia (składnia: $((...))). Gdy bash jest używany interaktywnie, dostępne jest uzupełnianie nazw plików, poleceń wbudowanych i zewnętrznych programów, zmiennych itd., co dzieje się po naciśnięciu klawisza TAB.

Działania na liczbach całkowitych

edytuj

Bash, w odróżnieniu od sh, umożliwia wykonanie obliczeń za pomocą wyrażeń w podwójnych nawiasach ((...)) oraz składni $[...]. Przykładowo:

 #!/bin/bash
 x1=55             # Przypisz liczbę 55 do zmiennej x1. Uwaga: Nie może być spacji przed i po znaku równości!
 ((x1 = x1 + 1))   # Dodaj jeden do x1. Nie stawia się tutaj znaku '$'.
 echo $((x1 + 1))  # Wypisz wartość x1+1 na ekran.
 ((++x1))          # Zwiększenie o jeden w stylu języka C.
 ((x1++))          # Podobnie jak powyżej ale teraz post-inkrementacja.
 echo $[x1=x1*20]  # Pomnóż x1 przez 20, zapisz wynik do x1 i wypisz wynik na ekran.
 echo $((x1 * 20)) # To samo co powyżej, ale nie zapisuj wyniku do zmiennej.
 echo $((x1<1000)) # Sprawdź czy x1 jest mniejsze od 1000 i wypisz na ekranie wartość 0 lub 1. Jeden oznacza prawdę.

Składnia ((...)) może być także wykorzystana w wyrażeniach warunkowych, ponieważ w wyniku wykonania zwracane jest 0 lub 1 w zależności od tego czy porównanie wartości zwraca prawdę czy fałsz.

 #!/bin/bash
 if ((x == y * 3 + z * 2))
 then
     echo Yes
 fi

 ((z > 23)) && echo Yes

Składnia ((...)) umożliwia posługiwanie się operatorami: ==, !=, >, <, >= i <=.

Bash nie umożliwia wykonywania obliczeń z wykorzystaniem liczb zmiennoprzecinkowych. Jedyne powłoki systemowe pozwalające na posługiwanie się liczbami zmiennoprzecinkowymi to powłoka Korna (1993) oraz zsh (od wersji 4.0).

Przekierowanie wejścia/wyjścia

edytuj

Bash rozszerza składnię powłoki sh służącą do przekierowania wejścia/wyjścia. Możliwe jest skierowanie standardowego wyjścia i standardowego wyjścia dla błędów do pliku w sposób krótszy niż w sh:

 polecenie &> plik

W powłoce Bourne’a wyglądałoby to następująco 'polecenie > plik 2>&'. Od wersji 2.05b możliwe jest przekierowanie zmiennej na standardowe wejście polecenia:

 #!/bin/bash
 polecenie <<< "Napis do przeczytania ze standardowego wejścia"
 #można też użyć zmiennej
 zmienna="Ala ma"
 cat <<< "${zmienna} kota."

Przykład: Przekieruj standardowe wyjście do pliku, wypisz dane, zamknij plik, zresetuj wyjście:

 exec 6>&1               # niech deskryptor pliku 6 stanie się kopią standardowego wyjścia
 exec 1>test.dane         # otwórz plik test.dane do zapisu, deskryptor nr 1 oznacza,
                          # że trafi do niego standardowe wyjście
 echo "dane:dane:dane"    # wypisz coś
 exec 1<&-                # zamknij plik
 exec 1>&6                # przywróć deskryptorowi 1 jego pierwotną funkcję
 exec <&-                # zamknij deskryptor 6

Otwórz i zamknij plik:

 # otwórz test.dane do czytania
 exec 6<test.dane
 # czytaj kolejne wiersze i wypisuj je, aż do napotkania końca pliku
 while read -u 6 dane
 do
    echo "$dane"
 done
 # zamknij plik
 exec 6<&-

Podstaw wyjście zewnętrznego polecenia do zmiennej:

 # wyszukaj pliki których nazwa kończy się na literę "h"
 # i zachowaj wynik w zmiennej ZM
 ZM=$(find . -name "*h")

Wbudowana obsługa wyrażeń regularnych

edytuj

Bash 3.0 posiada wbudowaną obsługę wyrażeń regularnych, dopasowanie odbywa się za pomocą składni przypominającej Perl:

    [[napis =~ wyrażenie]]

Używa się standardowych wyrażeń regularnych opisanych na stronie regex(7) podręcznika man. Powyższe polecenie zwraca wartość 0, gdy dopasowanie udało się lub 1 w przeciwnym przypadku. Podwyrażenia otoczone nawiasami są dostępne w zmiennej powłoki BASH_REMATCH, tak jak w poniższym przykładzie:

 if [[abcfoobarbletch =~ foo(bar)bl(.*)]]
 then
     echo "Dopasowanie udało się\!"
     echo $BASH_REMATCH               # wypisuje: foobarbletch
     echo ${BASH_REMATCH[1]}          # wypisuje: bar
     echo ${BASH_REMATCH[2]}          # wypisuje: etch
 fi

Używanie powyższej składni, zamiast programu grep, daje kod działający szybciej, ponieważ unika się kosztownego tworzenia nowego procesu.

Obsługa list jednoelementowych

edytuj

Bash obsługuje tworzenie tablic jednoelementowych[2].

Przykład użycia tablic:

# Utworzenie listy "lista"
lista=(a b c d e f g)

# Wyświetlenie wszystkich elementów listy
echo Wypisanie elementów listy:

echo ${lista[@]}

# Wypisanie samej nazwy listy spowoduje wyświetlenie jedynie pierwszego elementu
echo "Wypisanie samej nazwy listy spowoduje wyświetlenie jedynie pierwszego elementu"

echo $lista

# Wypisanie wszystkich elementów oddzielając poszczególne znakiem Enter
echo Wypisanie wszystkich elementów oddzielając poszczególne znakiem Enter

for element in ${lista[@]}; do
  echo $element
done

# Dodawanie elementów do listy (dopisuje do końca)
echo "Co chciałbyś dodać?: "
read new_elem
lista+=($new_elem)

Zobacz też

edytuj

Przypisy

edytuj
  1. Use zsh as the default shell on your Mac [online], Apple Support [dostęp 2019-07-01] (ang.).
  2. Arrays (Bash Reference Manual) [online], www.gnu.org [dostęp 2023-10-14] (ang.).

Linki zewnętrzne

edytuj