Co oznaczają następujące zmienne środowiskowe w systemie Linux?
- Co to jest $ * (znak dolara, po którym następuje gwiazdka)?
- Co to jest $ # (znak dolara obok znaku krzyżyka / znaku liczbowego / oktora / znaku funta)?
Od tutaj :
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
Zasadniczo $#
podano wiele argumentów, gdy skrypt został wykonany. $*
jest ciągiem zawierającym wszystkie argumenty. Na przykład $1
jest pierwszym argumentem i tak dalej. Jest to przydatne, jeśli chcesz uzyskać dostęp do określonego argumentu w skrypcie.
Jak zauważył Brian, oto prosty przykład. Jeśli uruchomisz następujące polecenie:
./command -yes -no /home/username
$#
= 3$*
= -yes -no /home/username
$@
= tablica: {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
itd.Są one częścią standardu POSIX i powinny być obsługiwane przez wszystkie zgodne powłoki. Dla odniesienia poniżej podano standardowe definicje POSIX dla każdego parametru specjalnego. Należy pamiętać, tam trzy dodatkowe zmienne: $-
, $$
i $!
.
$@
:
Rozwija się do parametrów pozycyjnych, zaczynając od jednego. Gdy interpretacja występuje w obrębie podwójnych cudzysłowów i gdy wykonywane jest dzielenie pól (patrz Dzielenie pól ), każdy parametr pozycyjny będzie rozszerzany jako osobne pole, z zastrzeżeniem, że rozwinięcie pierwszego parametru będzie nadal połączone z początkową częścią oryginalne słowo (zakładając, że rozwinięty parametr został osadzony w słowie), a rozwinięcie ostatniego parametru powinno być nadal połączone z ostatnią częścią oryginalnego słowa. Jeśli nie ma parametrów pozycyjnych, rozwinięcie „@” wygeneruje pola zerowe, nawet jeśli „@” jest podwójnie cytowany.
$*
:
Rozwija się do parametrów pozycyjnych, zaczynając od jednego. Kiedy rozwinięcie występuje w ciągu podwójnego cudzysłowu (patrz Podwójne cudzysłowy ), powinno ono rozwinąć się do pojedynczego pola z wartością każdego parametru oddzieloną przez pierwszy znak zmiennej IFS lub jeśli IFS jest nieustawiony. Jeśli IFS jest ustawiony na ciąg zerowy, nie jest to równoważne z jego rozbrojeniem; jego pierwszy znak nie istnieje, więc wartości parametrów są łączone.
$#
:
Rozwija się do dziesiętnej liczby parametrów pozycyjnych. Nazwa polecenia (parametr 0) nie będzie liczona w liczbie podanej przez „#”, ponieważ jest to parametr specjalny, a nie parametr pozycyjny.
$?
:
Rozwija się do dziesiętnego statusu wyjścia ostatniego potoku (patrz Rurociągi ).
$-
:
(Łącznik.) Rozwija się do bieżących flag opcji (jednuliterowe nazwy opcji połączone w ciąg), jak określono przy wywołaniu, za pomocą wbudowanego specjalnego polecenia set lub pośrednio przez powłokę.
$$
:
Rozwija się do dziesiętnego identyfikatora procesu wywoływanej powłoki. W podpowłoce (patrz Środowisko wykonywania powłoki ) „$” rozwija się do tej samej wartości, co bieżąca powłoka.
$!
:
Rozwija się do dziesiętnego ID procesu ostatniego polecenia w tle (patrz Listy ) wykonanego z bieżącej powłoki. (Na przykład polecenia w tle wykonywane z podpowłoki nie wpływają na wartość „$!” W bieżącym środowisku powłoki.) W potoku identyfikator procesu to identyfikator ostatniego polecenia w potoku.
$0
:
(Zero.) Rozwija się do nazwy powłoki lub skryptu powłoki. Zobacz sh, aby uzyskać szczegółowy opis tego, jak ta nazwa jest pochodna.
$*
i$#
są 1) zmiennymi powłoki, a nie zmiennymi środowiskowymi; 2) znormalizowany (część specyfikacji POSIX)"$@"
wiele razy jest napisane jako${1+"$@"}
(ze względu na przenośność), wyjaśnienie znajduje się na stackoverflow.com/questions/743454/ ...$#
reprezentuje liczbę argumentów:źródło