O que são $* e $# no Linux?
O que significam as seguintes variáveis de ambiente no Linux?
- o que é $* (sinal de dólar seguido de um asterisco)?
- O que é $# (sinal de dólar ao lado de um sinal de hash/número/octothorpe/libra)?
O que significam as seguintes variáveis de ambiente no Linux?
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.