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:

invocation

Działanie poszczególnych wariacji $* $@ wygląda następująco:

”$*”

star quoted

$*

star unquoted

”$@”

at quoted

$@

at unquoted

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.