Co to jest $ * i $ # w systemie Linux?

82

Co oznaczają następujące zmienne środowiskowe w systemie Linux?

  1. Co to jest $ * (znak dolara, po którym następuje gwiazdka)?
  2. Co to jest $ # (znak dolara obok znaku krzyżyka / znaku liczbowego / oktora / znaku funta)?
raghavayc
źródło

Odpowiedzi:

114

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.

Olli
źródło
1
Te specjalne parametry są prawdziwe we wszystkich powłokach Bourne'a (np. Sh, bash, dash, ash, ksh, zsh).
Dennis Williamson
Korekta: $*i $#są 1) zmiennymi powłoki, a nie zmiennymi środowiskowymi; 2) znormalizowany (część specyfikacji POSIX)
grawity
3
Zauważ też, że "$@"wiele razy jest napisane jako ${1+"$@"}(ze względu na przenośność), wyjaśnienie znajduje się na stackoverflow.com/questions/743454/ ...
hlovdal
Ponieważ „Nazwa polecenia (parametr 0) nie będzie liczona ...”, w powyższym przykładzie powinno być $ # = 2, zaczynając od zera
Josef Klimuk
0

$# reprezentuje liczbę argumentów:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3
Vikk_King
źródło
2
Witamy w Super User. Witryna jest bazą wiedzy, dlatego intencją jest, aby każda odpowiedź stanowiła odpowiedź na pytanie, na które jeszcze nie udzielono odpowiedzi. Dotyczy to tylko połowy pytania, a informacje są już dobrze ujęte w poprzedniej odpowiedzi.
fixer1234