Variáveis especiais no bash

3

Eu sei que estas são algumas variáveis especiais usadas pelo bash. Mas eu não sou capaz de compreendê-los. Alguém pode explicar quais são essas variáveis e como usá-las?

$*

$@

$#

    
por g_p 08.09.2014 / 23:12

4 respostas

10

Quando você chama um script de shell a partir da linha de comando, pode passar argumentos adicionais chamados Parâmetros posicionais. Por exemplo, ao inserir o seguinte na linha de comando para executar o script myscript.sh :

./myscript.sh param1 param2

As variáveis teriam os seguintes valores:

"$0" = "./myscript.sh"
"$1" = "param1"
"$2" = "param2"

A variável $# fornece o número de parâmetros, não incluindo o comando. Neste exemplo:

"$#" = 2

A variável $* lista todos os parâmetros como uma única palavra (citações adicionadas para enfatizar limites de strings):

"$*" = "param1 param2"

A variável $@ lista cada parâmetro como uma string entre aspas (aspas adicionadas para enfatizar os limites das strings):

"$@" = "param1" "param2"

Note que você deve quase sempre citar variáveis no bash, então você deve usar "$@" e não $@ . Consulte este guia de programação para obter mais informações.

    
por TheSchwa 08.09.2014 / 23:27
5

As variáveis $* & $@ são os argumentos passados ao invocar o script (ou função, se dentro de uma função).

"$@" é o que você deve usar normalmente: expande para separar palavras, um por um para os argumentos que são passados.

"$*" expande para uma única "palavra" que consiste em todos os argumentos separados por espaços.

(Nunca os use sem aspas; isso resulta em confusão de palavras e desordem geral com as quais você não quer lidar.)

$# é o número de argumentos (e como é sempre uma cadeia de dígitos, não importa se você o cita)

    
por Martin 08.09.2014 / 23:24
3

O shell trata vários parâmetros especialmente.

Esses parâmetros só podem ser referenciados; atribuição a eles não é permitida.

* Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, it expands to a single word with the value of each parameter separated by the first character of the IFS special variable. That is, "$*" is equivalent to "$1c$2c…", where c is the first character of the value of the IFS variable. If IFS is unset, the parameters are separated by spaces. If IFS is null, the parameters are joined without intervening separators.

@ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" …. If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined with the beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word. When there are no positional parameters, "$@" and $@ expand to nothing.

# Expands to the number of positional parameters in decimal.

$  Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the invoking shell, not the subshell.

Fonte: link

    
por kyodake 08.09.2014 / 23:29
0

Vou passar por um exemplo para mostrar o caso de uso dessas três variáveis especiais:

  • $# número de argumentos transmitidos para uma variável:

    $ bash -c 'echo number of args to this script are "$#"' _ hello word
    number of args to this script are 2
    
    • nossos args são olá e palavra, então o "2" está correto
  • $* será expandido para todos os parâmetros posicionais, como: "$ 1 $ 2":

    $ bash -c 'echo -n "args are: "; printf \"%s\" "$*"' _ hello word
    args are: "hello word"
    
    • Anote "Olá, palavra"
  • $@ : é como uma matriz de todos os parâmetros posicionais "$ 1", "$ 2" ...

    $ bash -c 'echo -n "args are: "; printf \"%s\" "$@"' _ hello word
    args are: "hello""word"
    
    • Anote "Olá" "palavra"
por Ravexina 08.08.2017 / 08:03

Tags