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

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

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

  1. o que é $* (sinal de dólar seguido de um asterisco)?
  2. O que é $# (sinal de dólar ao lado de um sinal de hash/número/octothorpe/libra)?

Respostas (2)

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

A partir de aqui :

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

Portanto, basicamente, $# é um número de argumentos dados quando o seu guião foi executado. $* é uma string contendo todos os argumentos. Por exemplo, $1 é o primeiro argumento e assim por diante. Isto é útil, se quiser aceder a um argumento específico no seu guião.

Como Brian comentou, aqui está um exemplo simples. Se correr seguindo o comando:

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

Estes são parte da norma POSIX , e devem ser suportados por todas as conchas conformes. Para a referência, abaixo estão as definições da norma POSIX para cada parâmetro especial. Note-se que há três variáveis adicionais: $-, $$ e $!.

$@:

Expande-se para os parâmetros posicionais, a partir de um. Quando a expansão ocorre dentro de aspas duplas, e onde a divisão do campo (ver Field Splitting ) é executada, cada parâmetro posicional deve expandir-se como um campo separado, com a provisão de que a expansão do primeiro parâmetro deve ainda ser unida com a parte inicial da palavra original (assumindo que o parâmetro expandido foi incorporado dentro de uma palavra), e a expansão do último parâmetro deve ainda ser unida com a última parte da palavra original. Se não houver parâmetros posicionais, a expansão de ‘@’ deve gerar campos zero, mesmo quando ‘@’ estiver duplamente cotado.

$*:

Expande-se para os parâmetros posicionais, a partir de um. Quando a expansão ocorre dentro de uma string com aspas duplas (ver aspas duplas ), deve expandir-se para um único campo com o valor de cada parâmetro separado pelo primeiro caracter da variável IFS, ou por um se IFS estiver desajustado. Se IFS for definido para uma string nula, isto não equivale a desactivá-lo; o seu primeiro carácter não existe, pelo que os valores dos parâmetros são concatenados.

$#:

Expande-se para o número decimal de parâmetros posicionais. O nome do comando (parâmetro 0) não é contado no número dado por ‘#’, porque é um parâmetro especial, não um parâmetro posicional.

$?:

Expande para o estado decimal de saída do gasoduto mais recente (ver Gasodutos ).

$-:

(Hífen.) Expande-se para as bandeiras das opções actuais (os nomes das opções de uma letra concatenadas numa cadeia), como especificado na invocação, pelo comando set especial embutido, ou implicitamente pela concha.

$$:

Expande até à identificação decimal do processo da concha invocada. Numa subcasa (ver Shell Execution Environment ), ‘$’ expande-se para o mesmo valor que o da actual concha.

$!:

Expande para a ID do processo decimal do comando de fundo mais recente (ver Listas ) executado a partir da shell actual. (Por exemplo, os comandos de fundo executados a partir das subcascasas não afectam o valor de “$!” no ambiente shell actual). Para um pipeline, o ID do processo é o do último comando no pipeline.

$0:

(Zero.) Expande-se para o nome da concha ou script da concha. Ver sh para uma descrição detalhada de como este nome é derivado.

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

$# representa o número de argumentos:

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

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