Respostas:
A partir daqui :
$# 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" ...).
Então, basicamente, $#
são apresentados vários argumentos quando seu script foi executado. $*
é uma sequência que contém todos os argumentos. Por exemplo, $1
é o primeiro argumento e assim por diante. Isso é útil se você deseja acessar um argumento específico em seu script.
Como Brian comentou, aqui está um exemplo simples. Se você executar o seguinte comando:
./command -yes -no /home/username
$#
= 3$*
= -yes -no /home/username
$@
= matriz: {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
etc.Eles fazem parte do padrão POSIX e devem ser suportados por todos os shells compatíveis. Para referência, abaixo estão as definições padrão POSIX para cada parâmetro especial. Observe que há três variáveis adicionais: $-
, $$
e $!
.
$@
:
Expande para os parâmetros posicionais, iniciando em um. Quando a expansão ocorre entre aspas duplas e onde a divisão de campo (consulte Divisão de campo ) é realizada, cada parâmetro posicional deve se expandir como um campo separado, com a condição de que a expansão do primeiro parâmetro ainda seja unida à parte inicial de a palavra original (assumindo que o parâmetro expandido foi incorporado a uma palavra) e a expansão do último parâmetro ainda deve ser associada à última parte da palavra original. Se não houver parâmetros posicionais, a expansão de '@' gerará zero campos, mesmo quando '@' estiver entre aspas duplas.
$*
:
Expande para os parâmetros posicionais, iniciando em um. Quando a expansão ocorre dentro de uma cadeia de caracteres entre aspas duplas (consulte aspas duplas ), ela deve se expandir para um único campo com o valor de cada parâmetro separado pelo primeiro caractere da variável IFS ou por um se IFS não estiver definido. Se o IFS estiver definido como uma cadeia nula, isso não será equivalente a desmarcá-lo; seu primeiro caractere não existe, portanto os valores dos parâmetros são concatenados.
$#
:
Expande para o número decimal de parâmetros posicionais. O nome do comando (parâmetro 0) não deve ser contado no número fornecido por '#' porque é um parâmetro especial, não um parâmetro posicional.
$?
:
Expande para o status de saída decimal do pipeline mais recente (consulte Pipelines ).
$-
:
(Hífen.) Expande para os sinalizadores de opção atuais (os nomes das opções de letra única concatenados em uma sequência de caracteres) conforme especificado na chamada, pelo comando interno especial set , ou implicitamente pelo shell.
$$
:
Expande para o ID do processo decimal do shell chamado. Em um subshell (consulte Shell Execution Environment ), '$' deve expandir para o mesmo valor que o shell atual.
$!
:
Expande para o ID do processo decimal do comando em segundo plano mais recente (consulte Listas ) executado no shell atual. (Por exemplo, comandos em segundo plano executados a partir de subshells não afetam o valor de "$!" No ambiente atual do shell.) Para um pipeline, o ID do processo é o do último comando no pipeline.
$0
:
(Zero.) Expande para o nome do shell ou script do shell. Consulte sh para obter uma descrição detalhada de como esse nome é derivado.
$*
e $#
são 1) variáveis de shell, não variáveis de ambiente; 2) padronizado (parte das especificações POSIX)
"$@"
muitas vezes está escrito como ${1+"$@"}
(por motivos de portabilidade), consulte stackoverflow.com/questions/743454/… para obter uma explicação.
$#
representa o número de argumentos:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3