bash

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

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

[edytuj | edytuj kod]

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 | edytuj kod]
Zrzut ekranu sesji Bash 3.1 przedstawiający jej specyfikę

Najciekawsze możliwości

[edytuj | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

Przypisy

[edytuj | edytuj kod]
  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 | edytuj kod]