Odpowiedzi:
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 $1jest 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= -yesitd.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:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3