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 $_
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 $@
- 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 $?
- 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 $$
- PID procesu bieżącej powłoki