Quais são as variáveis ​​especiais do shell do cifrão?

782

No Bash, parece haver várias variáveis ​​que possuem valores especiais com significado consistente. Por exemplo,

./myprogram &; echo $!

retornará o PID do processo em segundo plano myprogram. Eu conheço outros, como o $?que eu acho que é o atual TTY. Existem outros?

Z Douglas
fonte
15
Vários deles não são apenas Bash. Eles também são usados ​​em outros shells relacionados a Bourne e, de fato, são especificados pelo POSIX .
Pausado até novo aviso.
1
Que tal: IFS = $ '\ n' Consulte: stackoverflow.com/questions/4128235/…
sgu
1
@sgu Isso não é um parâmetro; esse é um tipo especial de citação. $'\n'é um caractere de nova linha literal que resultam de substituir o dígrafo \ncom ASCII 10.
chepner
Se você veio aqui procurando ${1}, ${*}, etc, as chaves são apenas para desambiguação, e muitas vezes redundantes. Isoladamente, ${x}é exatamente equivalente a $x.
Tripleee 21/07/19
O que $!significa isso ? Estou ciente, !$mas não disso.
Sridhar Sarnobat 5/03

Respostas:

1359
  • $1, $2, $3, ... são os parâmetros posicionais .
  • "$@"é uma construção semelhante a uma matriz de todos os parâmetros posicionais {$1, $2, $3 ...},.
  • "$*"é a expansão do IFS de todos os parâmetros posicionais $1 $2 $3 ...,.
  • $# é o número de parâmetros posicionais.
  • $- opções atuais definidas para o shell.
  • $$ pid do shell atual (não subshell).
  • $_ parâmetro mais recente (ou o caminho abs do comando para iniciar o shell atual imediatamente após a inicialização).
  • $IFS é o separador de campo (entrada).
  • $? é o status de saída do pipeline em primeiro plano mais recente.
  • $! é o PID do comando em segundo plano mais recente.
  • $0 é o nome do shell ou script do shell.

A maioria dos itens acima pode ser encontrada em Parâmetros especiais no Manual de referência do Bash. Existem todas as variáveis ​​de ambiente definidas pelo shell .

Para um índice abrangente, consulte o Índice Variável do Manual de Referência .

kojiro
fonte
2
Todos eles estão documentados na bashpágina do manual. A única singularidade é que $_é mencionada apenas no contexto de seu uso na MAILPATHvariável.
Chepner
4
olhar @chepner em man(1) bashsob parâmetros especiais para o resto da definição de $_.
Kojiro
8
Eu uso em !$vez de $_nos scripts do bash, porque o último às vezes falha.
amc
Boa lista kojiro. Encontrei esta sintaxe $ {1 + "$ @"}, o que isso significa?
user178047
3
@amc: consulte unix.stackexchange.com/questions/271659/… para obter diferenças entre !$e $_.
tricasse
44
  • $_ último argumento do último comando
  • $# número de argumentos transmitidos para o script atual
  • $*/ $@lista de argumentos transmitidos para o script como string / lista delimitada

Em cima da minha cabeça. Google para bash variáveis ​​especiais.

Dan
fonte
124
"Eu fiz. Eles me enviaram aqui." - Skit da livraria (doc oficial: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo
1
Eu acho que $@é a string e $*é a lista delimitada (de qualquer forma, de acordo com a resposta aceita acima).
RastaJedi
1
@RastaJedi: "$@"expande para uma lista, "$*"expande para uma única string. O comportamento especial de $@aplica-se quando está entre aspas duplas.
Keith Thompson
6
Voto negativo porque esta não é uma resposta muito completa ou útil. Dizer "Google it" mostra uma falta de esforço, especialmente considerando que a grande maioria das pessoas acaba aqui da pesquisa do Google. Eu acho que o mínimo que você poderia fazer é adicionar links à documentação oficial. TBH, o único motivo pelo qual não o sinalizei para exclusão foi porque é pelo menos uma resposta parcial à pergunta. Sei que é antigo, mas considere editá-lo para fornecer mais detalhes.
Sean the Bean
15

Para ajudar a entender o que $#, $0e $1, ..., $nnão, eu uso este script:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

A execução retorna uma saída representativa:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine
fedorqui 'Então pare de prejudicar'
fonte
4
O que significa o! I no seu loop for? É por isso que estou aqui e não consigo encontrar uma resposta em nenhum lugar porque não sei como chamá-lo.
Anthony
7
@ Anthony isso é chamado de variável indireta . Você pode encontrar uma boa explicação sobre o uso dele no bash: expansão indireta, por favor, explique? .
fedorqui 'Então, pare de prejudicar' 12/10
3

Tome cuidado com alguns dos exemplos; $ 0 podem incluir alguns caminhos principais, bem como o nome do programa. Por exemplo, salve esse script de duas linhas como ./mytry.sh e execute-o.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Resultado:

parameter 0 --> ./mytry.sh

Esta é uma versão atual (ano de 2016) do Bash, via Slackware 14.2

Adrian Cole
fonte
5
Se $ 0 inclui ou não um caminho, depende de como você executou o script em primeiro lugar. Se você executou "./mytry.sh", é isso que você verá em $ 0. Se você digitou "~ / mytry.sh", verá o caminho completo (porque o shell terá se expandido ~). Se você fez ". Mytry.sh", verá 'bash'.
Steve Folly