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

Cosa sono $* e $# in Linux?

Cosa significano le seguenti variabili d'ambiente in Linux?

  1. Cos'è $* (segno del dollaro seguito da un asterisco)?
  2. Cos'è $# (segno del dollaro accanto a un segno di hashish/segno di numero/segno di ottavo di dollaro/segno di libbra)?

Risposte (2)

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

Da qui :

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

Quindi fondamentalmente, $# è un numero di argomenti dati quando il tuo script è stato eseguito. $* è una stringa contenente tutti gli argomenti. Per esempio, $1 è il primo argomento e così via. Questo è utile se vuoi accedere a un argomento specifico nel tuo script.

Come ha commentato Brian, ecco un semplice esempio. Se esegui il seguente comando:

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

Questi sono parte dello standard POSIX , e dovrebbero essere supportati da tutte le shell conformi. Per riferimento, qui sotto ci sono le definizioni dello standard POSIX per ogni parametro speciale. Notate che ci sono tre variabili aggiuntive: $-, $$ e $!.

$@:

Espande i parametri posizionali, partendo da uno. Quando l'espansione avviene all'interno di virgolette doppie, e dove viene eseguita la divisione del campo (vedi Field Splitting ), ogni parametro posizionale si espande come un campo separato, con la disposizione che l'espansione del primo parametro sarà ancora unita con la parte iniziale della parola originale (assumendo che il parametro espanso fosse incorporato all'interno di una parola), e l'espansione dell'ultimo parametro sarà ancora unita con l'ultima parte della parola originale. Se non ci sono parametri posizionali, l'espansione di ‘@’ genera zero campi, anche quando ‘@’ è tra virgolette.

$*:

Espande ai parametri posizionali, partendo da uno. Quando l'espansione avviene all'interno di una stringa tra doppi apici (vedi Double-Quotes ), si espande ad un singolo campo con il valore di ogni parametro separato dal primo carattere della variabile IFS, o da a se IFS non è impostato. Se IFS è impostato su una stringa nulla, questo non equivale a disinserirla; il suo primo carattere non esiste, quindi i valori dei parametri sono concatenati.

$#:

Espande al numero decimale di parametri posizionali. Il nome del comando (parametro 0) non viene contato nel numero dato da ‘#’ perché è un parametro speciale, non un parametro posizionale.

$?:

Si espande allo stato decimale di uscita della pipeline più recente (vedi Pipelines ).

$-:

(Trattino.) Si espande ai flag delle opzioni correnti (i nomi delle opzioni a lettera singola concatenati in una stringa) come specificato all'invocazione, dal comando speciale integrato set , o implicitamente dalla shell.

$$:

Si espande all'ID decimale del processo della shell invocata. In una subshell (vedi Ambiente di esecuzione della shell ), ‘$’ si espande allo stesso valore di quello della shell corrente.

$!:

Si espande all'ID decimale del processo del più recente comando in background (vedi Liste ) eseguito dalla shell corrente. (Per esempio, i comandi in background eseguiti dalle subshell non influenzano il valore di “$!” nell'ambiente della shell corrente). Per una pipeline, l'ID del processo è quello dell'ultimo comando nella pipeline.

$0:

(Zero.) Si espande al nome della shell o dello script di shell. Vedere sh per una descrizione dettagliata di come viene derivato questo nome.

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

$# rappresenta il numero di argomenti:

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

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