Zmienne specjalne

Zmienne specjalne (ang. special variables, special parameters)

To najbardziej prywatne zmienne powłoki, są udostępniane użytkownikowi tylko do odczytu (są wyjątki). Kilka przykładów:

Zmienna Opis zmiennej
$0 nazwa bieżącego skryptu lub powłoki
$1..$9 Parametry przekazywane do skryptu (wyjątek, użytkownik może modyfikować ten rodzaj $-ych specjalnych.
$# :ref:Zawiera liczbę argumentów przekazanych do funkcji <topic_ref-code-organization-functions-params>` lub w linii poleceń

Zmienna $_

Zmienna $_ przechowuję ścieżkę z jaką został wywołany skrypt (powłoka).

johny@ThinkPad:~$ bash <<\EOF
> echo "Zostałem wysołany jako: $_"
> EOF
Zostałem wysołany jako: /bin/bash

W drugim przykładzie utworzymy plik o nazwie skrypt.sh i nastepującej zawartości:

#!/bin/bash
echo "Zostałem wysołany jako: $_"

i zrobimy go wykonywalnym uzywając polecenia chmod 755 skrypt.sh

Następnie wykonamy go na dwa sposoby - skrypt zrobi to samo ale wynik jego działania będzie inny.

Sposób 1 Sposób 2
johny@ThinkPad:~$ bash skrypt.sh
Zostałem wywołany jako: /bin/bash
johny@ThinkPad:~$ ./skrypt.sh
Zostałem wywołany jako: ./skrypt.sh

Dlaczego tak się stało?

W pierwszym przypadku programem uruchamiającym jest Bash i jego argumentem jest nazwa skryptu. W drugim przypadku system operacyjny uruchamia sam skrypt i sam interpretuje za pomocą instrukcji shebang, że skrypt musi być uruchomiony interpreterem Bashas.

Podpowiedź

Warto również zaznajomić się z poleceniem caller, które pozwala na osiągnięcie podobnej funkcji wewnątrz skryptu.

Zmienna $@

Zmienna $@ - Pokaże wszystkie parametry przekzywane do skryptu (też wyjątek), równoważne $1 $2 $3…, jeśli nie podane są żadne parametry $@ interpretowana jest jako nic.

Przykład:

#!/bin/bash
echo "Skrypt uruchomiono z parametrami: $@"

A teraz wywołaj ten skrypt z jakimiś parametrami, mogą być brane z powietrza np.:

./plik -a d

Efekt będzie wyglądał następująco:

Skrypt uruchomiono z paramertami -a d

Zmienna $?

Zmienna $? - kod powrotu ostanio wykonywanego polecenia (0 jeśli polecenie wykonało się poprawnie, innawartość jeśli błędnie).

bash$ touch plik
bash$ cat plik

Po sprawdzeniu wartości zmiennej $? uzyskujemy

bash$ echo $?
0

Ponieważ polecenie cat się udało, zmienna statusu zawiera 0. Teraz spróbujmy wykonać to polecenie na nie istniejącym pliku:

bash$ cat niematakiegopliku.txt
bash$ echo $?
1

Wartość 1 pokazuje, że powyższe polecenie się nie powiodło.

Zmienna $$

Zmienna $$ - PID procesu bieżącej powłoki