Bash
Interfejs programu | |
| Autor | Chet Ramey |
|---|---|
| Aktualna wersja stabilna | 5.3 (3 lipca 2025) [±] |
| System operacyjny | GNU |
| Rodzaj | Powłoka systemowa |
| Licencja | GNU GPL |
| Strona internetowa | |
bash – powł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 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
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.
Obsługa list jednoelementowych
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ż
- inne powłoki:
- potok
Przypisy
- ↑ Use zsh as the default shell on your Mac [online], Apple Support [dostęp 2019-07-01] (ang.).
- ↑ Arrays (Bash Reference Manual) [online], www.gnu.org [dostęp 2023-10-14] (ang.).
Linki zewnętrzne
- w języku polskim
- w języku angielskim
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.