Programowanie w Shellu (index)


Programowanie w Shellu (11) - export, source, macierze

ZADANIE 11.1

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

ZADANIE 11.2

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:

ZADANIE 11.3

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)

ZADANIE 11.4

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

READLINE

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.

MACIERZE

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.


Programowanie w Shellu (index)