Programowanie w Shellu (index)


Programowanie w Shellu (3) - polecenia shellowe, zmienne

ZADANIE 3.1

Zbadać zmienne powłoki.


$ printenv          (pokaże całe środowisko)
$ printenv HOME     (pokaże daną zmienną środowiskową)

$ help set
$ set
    (wypisze zmienne środowiskowe i programowe)
    (polecenie służy do zmieniania opcji i argumentów shella)

$ help declare
$ declare           (tak jak "set")

$ env               (pokaże środowisko jak "printenv")
    (można też uruchomić program w zmienionym środowisku)
$ env ZMIENNA="wartosc"       (definiowanie zmiennej w dowolnym shellu)

$ ZMIENNA="jakis napis"
    (definiowanie zmiennej w bash; nie ma spacji dokola =)
$ echo $ZMIENNA     (wypisanie zawartości zmiennej)
$ echo ${ZMIENNA}   (dobry zwyczaj to nawiasy klamrowe)

$ help export
$ export ZMIENNA    (ustawienie zmiennej jako globalnej)
$ export            (pokaże zmienne eksportowane)

$ ZMIENNA="wartosc" ; export ZMIENNA
    (typowy ciąg poleceń stosowany w skryptach)
$ declare -x ZMIENNA="wartosc"          (jak wyżej)
$ declare -p ZMIENNA          (pokazanie atrybutów zmiennej)

$ help unset
$ unset ZMIENNA     (kasowanie zmiennej w bash)
$ env -u ZMIENNA    (kasowanie zmiennej w dowolnym shellu)

ZADANIE 3.2

Stworzyć plik witaj.sh postaci:


#!/bin/bash
#
# witaj.sh
#
# Prosty skrypt korzystajacy ze zmiennych shella.

echo "Witaj ${LOGNAME}!"
echo "Pracujesz na komputerze ${HOSTNAME}."
# opcja -n, aby nie bylo przejscia do nowej linii 
echo -n "Dzisiejsza data: "
date
echo -n "Katalog biezacy: "
pwd

Nadajemy skryptowi prawo wykonywania poleceniem: chmod a+x witaj.sh

Uruchamiamy skrypt poleceniem: ./witaj.sh

Modyfikujemy skrypt wykorzystując cytowanie poleceń:


echo "Dzisiejsza data: $(date)."
echo "Katalog biezacy: $(pwd)."

ZADANIE 3.3

Stworzyć plik stan.sh postaci:


#!/bin/bash
#
# stan.sh
#
# Sprawdzanie stanu. Skrypt wykorzystuje polecenie "grep"
# i wyrazenia regularne.

echo -n "Katalog biezacy: "
pwd
echo -n "Liczba pozycji w katalogu biezacym: "
ls | wc -l
echo -n "Liczba katalogow: "
ls -l | grep "^d" | wc -l
echo -n "Liczba plikow i katalogow ukrytych: "
ls -a | grep "^[.]" | wc -l


Uruchomić skrypt poleceniem: ./stan.sh

Uzupełnić skrypt, aby podawał inne informacje o systemie, np. liczbę i identyfikatory pracujących użytkowników.

OPERACJE NA PLIKACH I KATALOGACH

Polecenia dotyczące katalogów: pwd, ls, cd, mkdir, rmdir, rm -r, cp -R, mv, ln, du.

Polecenia dotyczące plików: touch, cat, cp, mv, rm, ln, file, find.

Polecenia podziału plików: split, csplit.

Polecenia wyboru działające na wierszach: grep, head, sed, tail, uniq. Bardzo przydają się wyrażenia regularne.

Polecenia wyboru działające na kolumnach: cut.

Polecenia łączenia plików działające na wierszach: cat, join.

Polecenia łączenia plików działające na kolumnach: paste.

Zliczanie wierszy: wc.

Polecenia porządkujące pliki: sort.

Polecenia przekształcania plików: sed, tr, awk.

Polecenia wyświetlania plików: more, less, cat, pg.

Polecenia porównywania plików: cmp, diff, merge.

ZMIENNE W BASH

Zmienne udostępniane przez powłokę możemy podzielić na trzy rodzaje:

Zmienne muszą się zaczynać od litery lub znaku podkreślenia. KONWENCJA: zmienne powłoki w bash piszemy dużymi literami. Zmienna albo jest ustawiona (może być pusta), albo nie jest ustawiona, czyli nigdy nie przypisano jej wartości. Zmienną ustawioną usuwamy poleceniem unset.

Zmienne używane przez Bash tak jak przez Bourne Shell: CDPATH, HOME, IFS, MAIL, MAILPATH, OPTARG, OPTIND, PATH, PS1, PS2.

ZMIENNE SPECJALNE SHELLA


$#                  (liczba argumentów pozycyjnych)
$0                  (nazwa bieżącego skryptu lub powłoki) 
$1, ... , $9        (parametry przekazywane do skryptu - można modyfikować)
$*                  (rozwijane do "$1 $2 ...")
$@                  (rozwijane do "$1" "$2" ...)
$-                  (opcje shella z polecenia set)
$?                  (kod powrotu ostatnio wykonywanego polecenia)
$$                  (PID bieżącego procesu powłoki)
$!                  (PID procesu ostatniego zadania wsadowego)

Zmienną $$ (PID) można wykorzystać w skrypcie do wygenerowania liczby losowej z zadanego przedziału, np. 1-100. Każde uruchomienie skryptu da nam praktycznie inną liczbę.


Programowanie w Shellu (index)