Programowanie w Shellu (index)
Zbadać pliki konfiguracyjne shella bash.
$ less /etc/profile (Debian: ustawienie PATH, PS1, umask) $ less /etc/bash.bashrc (Debian: wykonywany przez shelle interaktywne) $ less /etc/bashrc (RedHat: wykonywany przez shelle interaktywne) $ less ${HOME}/.bash_profile (Debian: wykonywany przez login shells; wczytanie .bashrc) $ less ${HOME}/.bash_login (wykonywany, jeżeli nie istnieje .bash_profile) $ less ${HOME}/.profile (wykonywany, jeżeli nie istnieją .bash_profile i .bash_login) $ less ${HOME}/.bashrc (Debian: wykonywany przez non-login shells) $ less ${HOME}/.bash_history (polecenia z poprzedniej sesji) $ less ${HOME}/.bash_logout (wykonywany podczas zamykania sesji) $ less /etc/shells (powłoki zainstalowane w systemie) $ set | grep BASH (zmienne związane z bash; w Debianie: BASH, BASH_VERSINFO, BASH_VERSION) $ less /etc/inputrc $ help bind $ bind -l $ bind -v
Stworzyć pliki export1.sh i export2.sh.
#!/bin/bash # # export1.sh # INSTRUKCJA 1a LICZBA=10 # INSTRUKCJA 1b # export LICZBA # INSTRUKCJA 1c ./export2.sh # INSTRUKCJA 1d #. ./export2.sh echo "$0: LICZBA wynosi $LICZBA"
#!/bin/bash # # eksport2.sh # INSTRUKCJA 2a # LICZBA=20 echo "$0: LICZBA wynosi ${LICZBA}"
Uruchomić skrypt export1.sh przy różnych zestawach aktywnych (nie zamienionych w komentarz) instrukcji:
Zbadać możliwości korzystania z macierzy w powłoce bash.
$ declare -a MACIERZ_A # jawna deklaracja macierzy $ MACIERZ_B[0]="aa" # niejawna deklaracja macierzy $ MACIERZ_B[1]="bb" # z wykorzystaniem indeksów $ MACIERZ_B[2]="cc" $ set | less # sprawdzenie istnienia macierzy $ MACIERZ_C=([0]="aa" [1]="bb" [2]="cc") # pełny zapis deklarowania macierzy $ MACIERZ_D=(aa bb cc) # skrótowy zapis deklaracji macierzy $ echo ${MACIERZ_D[1]} # odwołanie się do elementu macierzy bb $ echo ${MACIERZ_D[*]} # wypisanie całej macierzy aa bb cc $ readonly -a MACIERZ_C # ustawienie macierzy tylko do odczytu $ unset MACIERZ_D[2] # usunięcie wybranego elementu macierzy $ unset MACIERZ_D # usunięcie całej macierzy
# Zastosowanie w skrypcie do wczytania danych: read -p "Podaj elementy macierzy: " -a MACIERZ (elementy macierzy będą automatycznie numerowane od zera)
Stworzyć plik babelek.sh postaci:
#!/bin/bash # # babelek.sh # # Sortowanie babelkowe ciagu liczb przechowywanego w globalnej # zmiennej macierzowej MACIERZ. # Nie ma ograniczenia na liczbe sortowanych elementow. # Nie ma potrzeby wyznaczania na poczatku liczby sortowanych # elementow, poniewaz petla while sama zatrzyma sie na koncu. # Funkcja dziala poprawnie nawet przy zerowej liczbie elementow. babelek() { local TMP local I=1 while [ "${MACIERZ[I]}" ] do local J=1 while [ "${MACIERZ[J]}" ] do if [ ${MACIERZ[J-1]} -gt ${MACIERZ[J]} ] ; then # przestawiamy sasiednie elementy TMP=${MACIERZ[J-1]} MACIERZ[J-1]=${MACIERZ[J]} MACIERZ[J]=${TMP} fi let "J=J+1" done let "I=I+1" done return 0 } echo -n "Podaj ciag liczb: " read -a MACIERZ echo "Liczby przed sortowaniem" echo ${MACIERZ[*]} babelek echo "Liczby po sortowaniu" echo ${MACIERZ[*]} exit 0
Uruchomić skrypt poleceniem: ./babelek.sh
Wiersz edycji polecenia może pracować w dwóch trybach: emacs (domyślny) lub vi. Bash korzysta z biblioteki Readline. Nazwa pliku konfiguracyjnego znajduje się w zmiennej INPUTRC, która zwykle zawiera /etc/inputrc (jeżeli nie ma tej zmiennej to szukany jest plik ~/.inputrc). Dostępne funkcje i przypisane do nich klawisze można obejrzeć za pomocą polecenia bind i jego opcji.
Bash dostarcza jednowymiarowych zmiennych macierzowych (arrays). Elementy macierzy numerowane są od zera, nie ma ograniczeń na rozmiar macierzy i nie wszystkie kolejne elementy macierzy muszą być przypisane. Kilka poleceń wbudowanych Bash ma opcje dotyczące macierzy. Bash korzysta z kilku wbudowanych zmiennych macierzowych.