Czym są $* i $# w Linuksie?
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 haszującego/cyfrowego/oktogonowego/funtowego)?
Co oznaczają następujące zmienne środowiskowe w systemie Linux?
Z 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" ...).
Czyli w zasadzie $#
to liczba argumentów podanych podczas wykonywania skryptu. $*
jest łańcuchem zawierającym wszystkie argumenty. Na przykład, $1
jest pierwszym argumentem i tak dalej. Jest to przydatne, jeśli chcesz uzyskać dostęp do konkretnego argumentu w skrypcie.
Jak Brian skomentował, oto prosty przykład. Jeśli uruchomisz następującą komendę:
./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 znajdują się definicje standardu POSIX dla każdego parametru specjalnego. Zwróć uwagę, że istnieją trzy dodatkowe zmienne: $-
, $$
i $!
.
$@
:
Rozwija do parametrów pozycyjnych, zaczynając od jednego. Gdy interpretacja występuje w cudzysłowach i gdy wykonywany jest podział na pola (zobacz Podział na pola ), każdy parametr pozycyjny interpretowany jest jako osobne pole, z zastrzeżeniem, że interpretacja pierwszego parametru nadal łączy się z początkową częścią oryginalnego słowa (zakładając, że interpretowany parametr był osadzony w słowie), a interpretacja ostatniego parametru nadal łączy się z ostatnią częścią oryginalnego słowa. Jeżeli nie ma parametrów pozycyjnych, to interpretacja ‘@’ generuje zero pól, nawet gdy ‘@’ jest dwukrotnie cytowane.
$*
:
Interpretuje do parametrów pozycyjnych, zaczynając od jednego. Gdy interpretacja występuje wewnątrz podwójnie cytowanego łańcucha (zobacz Podwójne cudzysłowy ), to rozwija się do pojedynczego pola z wartością każdego parametru oddzieloną pierwszym znakiem zmiennej IFS, lub znakiem a jeśli IFS jest nieustawione. Jeśli IFS jest ustawione na łańcuch pusty, to nie jest to równoznaczne z jego usunięciem; jego pierwszy znak nie istnieje, więc wartości parametrów są konkatenowane.
$#
:
Rozszerza do dziesiętnej liczby parametrów pozycyjnych. Nazwa polecenia (parametr 0) nie jest wliczana do liczby podanej przez ‘#’, ponieważ jest to parametr specjalny, a nie parametr pozycyjny.
$?
:
Rozszerza się do dziesiętnego statusu zakończenia ostatniego rurociągu (patrz Rurociągi ).
$-
:
(myślnik.) Interpretowane jako bieżące flagi opcji (jednoliterowe nazwy opcji połączone w łańcuch) określone przy wywołaniu, przez wbudowane polecenie specjalne set lub niejawnie przez powłokę.
$$
:
Interpretowane jako dziesiętne ID procesu wywoływanej powłoki. W podpowłoce (zobacz Środowisko wykonywania powłoki ), ‘$’ interpretowane jest jako ta sama wartość, co w bieżącej powłoce.
$!
:
Interpretowane jako dziesiętne ID procesu ostatniego polecenia tła (zobacz Listy ) wykonanego z bieżącej powłoki. (Na przykład, polecenia tła wykonywane z podpowłok nie mają wpływu na wartość “$!” w środowisku bieżącej powłoki). Dla potoku, identyfikatorem procesu jest identyfikator ostatniego polecenia w potoku.
$0
:
(Zero.) Interpretowane jako nazwa powłoki lub skryptu powłoki. Zobacz sh dla szczegółowego opisu, jak ta nazwa jest uzyskiwana.