Risposte:
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
= -yes
ecc.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.
$*
e $#
sono 1) variabili di shell, non variabili di ambiente; 2) standardizzato (parte delle specifiche POSIX)
"$@"
molte volte è scritto come ${1+"$@"}
(per motivi di portabilità), consultare stackoverflow.com/questions/743454/… per una spiegazione.
$#
rappresenta il numero di argomenti:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3