bash

bash
Ilustracja
Interfejs programu
AutorChet Ramey
Aktualna wersja stabilna5.2-alpha
(20 stycznia 2022) [±]
System operacyjnyGNU
RodzajPowłoka systemowa
LicencjaGNU GPL
Strona internetowa

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

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

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

Najciekawsze możliwości

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

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. 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

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

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.

Zobacz też

Przypisy

  1. Use zsh as the default shell on your Mac, Apple Support [dostęp 2019-07-01] (ang.).

Linki zewnętrzne

Media użyte na tej stronie

Heckert GNU white.svg
(c) Aurelio A. Heckert, CC BY-SA 2.0
A bold GNU head.
Bash screenshot.png
Autor: Emx, Licencja: GPL
Screenshot of Bourne Again SHell (BASH).