2011-02-17 18:53:26 +0000 2011-02-17 18:53:26 +0000
83
83

Czym są $* i $# w Linuksie?

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 haszującego/cyfrowego/oktogonowego/funtowego)?

Odpowiedzi (2)

117
117
117
2011-02-17 18:59:34 +0000

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.

0
0
0
2018-09-24 05:34:09 +0000

$# reprezentuje liczbę argumentów:

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

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3