Skrypty powłoki Bash #5 - goście specjalni
Intro
Dzień dobry, dzień dobry. Dzisiaj na odwiedzą nas goście specjalni… no właściwie zmienne specjalne. :)
Poznajmy naszych gości.
Poniżej prezentuję listę kilku wybranych zmiennych specjalnych. Oczywiście jest ich więcej niż nasi dzisiejsi goście jak np. PATH
czy LD_LIBRARY
, czy zmienne powłoki.
My zaś zajmiemy się dziś zmiennymi najczęściej używanymi przy pisaniu skryptów:
- $0
- ${n}
- $#
- $*
- $@
- $?
- $$
- $!
Pozwólcie, że przedstawię każdego z gości z osobna :)
$0
Jest to zmienna przechowująca pierwszy z argumentów pozycyjnych.
Pierwszy argument pozycyjny przechowuję nazwę pliku.
Może się przydać, przy sprawdzaniu, czy nasz skrypt nazywa się poprawnie (np. zgodność z licencją/oryginałem) albo gdy chcemy wywołać ten sam program, ale z innymi parametrami
${n}
Gdy za ‘n’ podstawimy dowolną cyfrę lub liczbę otrzymamy n-ty argument pozycyjny.
Tym sposobem uzyskujemy dostęp do kolejnych argumentów przekazanych do skryptu.
poniżej 10 możemy używać samego $n bez {} ale wyżej już musimy używać {} ponieważ bash zrozumie tylko pierwszy znak po $
$#
Nasz kolejny gość ma wiedzę na temat ilości argumentów przekazanych do skryptu. Jeśli będą to dwa argumentu, to tu znajdziecie liczbę 2.
Inaczej można powiedzieć, że zawiera index ostatniego argumentu.
$* i $@
Ci dwaj bracia to prawdziwi psotnicy, przechowują oni wszystkie argumenty, przekazane do skryptu, jednak każdy inaczej.
$* - nie bawi się w organizacje i wrzuca wszystko w jeden sznurek (string), ale tylko wtedy, gdy go zacytujemy -> “$*”
$@ - ten zaś jest bardzo skrupulatny i układa każdy argument w swojej komórce i nawet argumentów zapisanych w cudzyłowie nie rozdziela … chyba że go nie zacytujemy, to wtedy rozdziela.
Zobrazuję to przy pomocy tego kodu:
#!/bin/bash
echo "Uzywajac \"\$*\":"
i=0
for a in "$*"; do
i=$((i+1))
echo "iterator: "$i;
echo $a;
done
i=0
echo -e "\nUzywajac \$*:"
for a in $*; do
i=$((i+1))
echo "iterator: "$i;
echo $a;
done
i=0
echo -e "\nUzywajac \"\$@\":"
for a in "$@"; do
i=$((i+1))
echo "iterator: "$i;
echo $a;
done
i=0
echo -e "\nUzywajac \$@:"
for a in $@; do
i=$((i+1))
echo "iterator: "$i;
echo $a;
done
i=0
Może nie jest piękny, ale pokazuje co trzeba :)
Po wywołaniu skryptu w ten sposób:
Działanie poszczególnych wariacji $* $@ wygląda następująco:
”$*”
$*
”$@”
$@
Mówią, że obraz wyraża więcej, niż tysiąc słów. To też wam pokazuje. Bo Ja zawsze zapominam, który jest który. :D
$?
Ten tajemniczy gość przechowuje kod statusu ostatniej komendy. Jest to smutny człowiek, ponieważ, jeśli wszystko idzie po myśli programisty, to on, prawdę mówiąc, jest zerem.
(0 = brak błędów)
Natomiast, jeśli programista zrobi jakiś błąd, to on aż rośnie w oczach ^^
(1 = ogólny błąd wykonania, 127 = komenda nie istnieje/nie znaleziona)
$$
Ten Pan przechowuje informację o Identyfikatorze procesu (PID). Dość ważny gość, ale często pomijany.
$!
Ten Pan jest pamiętliwy, ponieważ pamięta numer ostatniego procesu, który puściliśmy w tło (i pewnie o nim zapomnieliśmy… ale on pamięta) przydatny, jeśli próbujemy zrobić coś “asynchronicznie”
Epilog
To byliby wszyscy nasi dzisiejsi goście.
Poznaliście dziś bardzo ważne osobistości w świecie skryptowania w Bash’u.
Nie zapominajcie o nich, a z chęcią wam pomogą.
W naszym następnym spotkaniu opowiem wam o tablicach.
Zapraszam serdecznie.