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.