O que são $ * e $ # no Linux?


82

O que significam as seguintes variáveis ​​de ambiente no Linux?

  1. O que é $ * (cifrão seguido de um asterisco)?
  2. O que é $ # (cifrão ao lado de uma marca de hash / sinal de número / octothorpe / libra)?

Respostas:


115

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= -yesetc.

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.


1
Esses parâmetros especiais são verdadeiros em todos os shells derivados de Bourne (por exemplo, sh, bash, dash, ash, ksh, zsh).
Dennis Williamson

Correção: $*e $#são 1) variáveis ​​de shell, não variáveis ​​de ambiente; 2) padronizado (parte das especificações POSIX)
grawity

3
Observe também que "$@"muitas vezes está escrito como ${1+"$@"}(por motivos de portabilidade), consulte stackoverflow.com/questions/743454/… para obter uma explicação.
hlovdal

Como 'O nome do comando (parâmetro 0) não deve ser contado ...', no exemplo acima deve ser $ # = 2, começando a contar a partir de 0.
Josef Klimuk

0

$# representa o número de argumentos:

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

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

2
Bem-vindo ao superusuário. O site é uma base de conhecimento; portanto, a intenção é que cada resposta forneça uma solução para a pergunta que ainda não foi contribuída. Isso aborda apenas metade da pergunta e as informações já estão bem cobertas na resposta anterior.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.