Bash
![]() | |||
![]() Interfejs programu | |||
Autor | Chet Ramey | ||
---|---|---|---|
Aktualna wersja stabilna | 5.2.32 (2 sierpnia 2024) [±] | ||
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
![](http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Bash_demo.png/220px-Bash_demo.png)
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
Linki zewnętrzne
- w języku polskim
- Podręcznik systemowy (strona man)
- w języku angielskim
- Strona domowa basha w projekcie GNU
- Podręcznik basha na stronie projektu GNU
- Advanced Bash-Scripting Guide
- p
- d
- e
Historia | |
---|---|
Licencje | |
Programy | |
Postacie |
|