Cosa sono $ * e $ # in Linux?


82

Cosa significano le seguenti variabili d'ambiente in Linux?

  1. Che cos'è $ * (simbolo del dollaro seguito da un asterisco)?
  2. Che cos'è $ # (simbolo del dollaro accanto a un segno di hash / segno di numero / ottotorpe / cancelletto)?

Risposte:


115

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, $#viene fornita una serie di argomenti durante l'esecuzione dello script. $*è una stringa contenente tutti gli argomenti. Ad 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 si esegue il comando seguente:

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

Questi fanno parte dello standard POSIX e dovrebbero essere supportati da tutte le shell conformi. Per il riferimento, di seguito sono riportate le definizioni standard POSIX per ciascun parametro speciale. Do atto ci sono tre variabili aggiuntive: $-, $$e $!.

$@:

Si espande nei parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie e in cui viene eseguita la divisione del campo (vedere Divisione del campo ), ciascun parametro posizionale si espande come un campo separato, a condizione che l'espansione del primo parametro sia ancora unita alla parte iniziale di la parola originale (supponendo che il parametro espanso fosse incorporato in una parola) e l'espansione dell'ultimo parametro deve comunque essere unita all'ultima parte della parola originale. Se non ci sono parametri posizionali, l'espansione di '@' genera zero campi, anche quando '@' è tra virgolette doppie.

$*:

Si espande nei parametri posizionali, a partire da uno. Quando l'espansione avviene all'interno di una stringa tra virgolette doppie (vedi virgolette doppie ), si espande in un singolo campo con il valore di ciascun parametro separato dal primo carattere della variabile IFS o da un IFS non impostato. Se IFS è impostato su una stringa nulla, ciò non equivale a annullarla; il suo primo carattere non esiste, quindi i valori dei parametri vengono concatenati.

$#:

Si espande al numero decimale di parametri posizionali. Il nome del comando (parametro 0) non deve essere conteggiato nel numero dato da '#' perché è un parametro speciale, non un parametro posizionale.

$?:

Si espande allo stato di uscita decimale della pipeline più recente (consultare Pipeline ).

$-:

(Trattino.) Si espande ai flag delle opzioni correnti (i nomi delle opzioni a lettera singola concatenati in una stringa) come specificato al momento dell'invocazione, tramite il comando incorporato speciale impostato o implicitamente dalla shell.

$$:

Si espande nell'ID del processo decimale della shell invocata. In una subshell (consultare l' ambiente di esecuzione della shell ), "$" si espande allo stesso valore di quello della shell corrente.

$!:

Si espande nell'ID del processo decimale dell'ultimo comando in background (vedi Elenchi ) eseguito dalla shell corrente. (Ad esempio, i comandi in background eseguiti da subshells non influiscono sul valore di "$!" Nell'attuale ambiente shell.) Per una pipeline, l'ID processo è quello dell'ultimo comando nella pipeline.

$0:

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


1
Questi parametri speciali sono veri in tutte le shell derivate da Bourne (ad es. Sh, bash, dash, ash, ksh, zsh).
Dennis Williamson,

Correzione: $*e $#sono 1) variabili di shell, non variabili di ambiente; 2) standardizzato (parte delle specifiche POSIX)
gravità

3
Si noti inoltre che "$@"molte volte è scritto come ${1+"$@"}(per motivi di portabilità), consultare stackoverflow.com/questions/743454/… per una spiegazione.
hlovdal,

Poiché "Il nome del comando (parametro 0) non deve essere conteggiato ...", nell'esempio sopra dovrebbe essere $ # = 2, iniziando a contare da 0.
Josef Klimuk,

0

$# rappresenta il numero di argomenti:

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

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

2
Benvenuto in Super User. Il sito è una base di conoscenza, quindi l'intento è che ogni risposta fornisca una soluzione alla domanda che non è già stata fornita. Questo affronta solo metà della domanda e le informazioni sono già ben coperte nella risposta precedente.
fixer1234
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.