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

Wat is $* en $# in Linux?

Advertisement

Wat betekenen de volgende omgevingsvariabelen in Linux?

  1. Wat is $* (dollarteken gevolgd door een sterretje)?
  2. Wat is $# (dollarteken naast een hash-teken/cijferteken/ctothorpe/pondteken)?
Advertisement
Advertisement

Antwoorden (2)

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

Van hier :

$# 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" ...).

Dus eigenlijk is $# een aantal argumenten dat is gegeven toen je script werd uitgevoerd. $* is een string die alle argumenten bevat. Bijvoorbeeld, $1 is het eerste argument en zo verder. Dit is handig, als je toegang wilt tot een specifiek argument in je script.

Zoals Brian al opmerkte, is hier een eenvoudig voorbeeld. Als je het volgende commando uitvoert:

./command -yes -no /home/username
  • $# = 3
  • $* = -yes -no /home/username
  • $@ = array: {"-yes", "-no", "/home/username"}
  • $0 = ./command, $1 = -yes enz.

Deze zijn onderdeel van POSIX standaard , en zouden ondersteund moeten worden door alle shells die hieraan voldoen. Ter referentie, hieronder staan de POSIX standaard definities voor elke speciale parameter. Merk op dat er drie extra variabelen zijn: $-, $$ en $!.

$@:

Breidt uit naar de positionele parameters, te beginnen bij één. Wanneer de uitbreiding binnen dubbele aanhalingstekens plaatsvindt, en waar veldsplitsing (zie Veldsplitsing ) wordt uitgevoerd, zal elke positionele parameter als een afzonderlijk veld uitbreiden, met de bepaling dat de uitbreiding van de eerste parameter nog steeds zal worden samengevoegd met het begin van het oorspronkelijke woord (aannemend dat de uitgebreide parameter in een woord was ingesloten), en dat de uitbreiding van de laatste parameter nog steeds zal worden samengevoegd met het laatste deel van het oorspronkelijke woord. Als er geen positionele parameters zijn, genereert de uitbreiding van ‘@’ nul velden, zelfs als ‘@’ dubbel is aangehaald.

$*:

Expansie naar de positionele parameters, te beginnen bij één. Wanneer de uitbreiding plaatsvindt binnen een tekenreeks met dubbele aanhalingstekens (zie Dubbele aanhalingstekens ), wordt er uitgebreid naar een enkel veld met de waarde van elke parameter gescheiden door het eerste teken van de IFS-variabele, of door a als IFS niet is ingesteld. Als IFS is ingesteld op een null string, is dit niet gelijk aan het uitschakelen ervan; het eerste teken ervan bestaat niet, dus worden de parameterwaarden samengevoegd.

$#:

Uitbreiding tot het decimale aantal positionele parameters. De opdrachtnaam (parameter 0) wordt niet meegeteld in het aantal dat door ‘#’ wordt gegeven, omdat het een speciale parameter is en geen positionele parameter.

$?:

Uitbreiding tot de decimale uitgangsstatus van de meest recente pijplijn (zie Pijplijnen ).

$-:

(Koppelteken.) Uitbreiding tot de huidige optievlaggen (de eenlettergrepige optienamen samengevoegd tot een string) zoals opgegeven bij het aanroepen, door het speciale ingebouwde commando set , of impliciet door de shell.

$$:

Uitbreiding tot de decimale proces-ID van de aangeroepen shell. In een subshell (zie Shell Execution Environment ), breidt ‘$’ uit tot dezelfde waarde als die van de huidige shell.

$!:

Breidt uit naar de decimale proces-ID van de meest recente achtergrondopdracht (zie Lijsten ) die vanuit de huidige shell is uitgevoerd. (Bijvoorbeeld, achtergrondcommando’s uitgevoerd vanuit subshells hebben geen invloed op de waarde van “$!” in de huidige shell-omgeving). Voor een pijplijn is de proces-ID die van de laatste opdracht in de pijplijn.

$0:

(Nul.) Breidt uit tot de naam van de shell of het shellscript. Zie sh voor een gedetailleerde beschrijving van hoe deze naam wordt afgeleid.

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

$# staat voor het aantal argumenten:

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

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

Gerelateerde vragen

6
10
5
37
6
Advertisement