Variáveis especiais do Bash: o papel de $#
Gabarito: letra A. A variável especial $# no Bash armazena a quantidade de argumentos passados ao script na linha de comando — é exatamente o que a alternativa A descreve. As demais alternativas confundem $# com outras variáveis especiais: $0 (nome do script), $? (código de retorno do último comando), $USER (usuário) e $?/permissões (bits de permissão não são acessados por variável especial).
O Bash, assim como outros shells do tipo Bourne, oferece um conjunto de variáveis especiais que são preenchidas automaticamente pelo interpretador no momento da execução de um script. Essas variáveis são a forma de o script "enxergar" o ambiente em que foi chamado: quem o invocou, com quais argumentos, qual o código de retorno do último comando, qual o PID do processo atual, entre outros. Dominar essas variáveis é essencial para escrever scripts que se comportem de maneira dinâmica, pois elas permitem que o script reaja à forma como foi executado.
A variável $# é uma das mais utilizadas em scripts de validação. Ela conta quantos argumentos foram fornecidos após o nome do script. Por exemplo, se um script meuscript.sh for executado como ./meuscript.sh arg1 arg2 arg3, o valor de $# será 3. Esse valor é frequentemente usado em estruturas condicionais para verificar se o usuário forneceu a quantidade esperada de argumentos, como em if [ $# -ne 2 ]; then echo "Uso: $0 arquivo1 arquivo2"; exit 1; fi. Note que $0 (nome do script) não é contado em $# — apenas os argumentos posicionais $1, $2, etc.
A confusão mais comum é trocar $# por outras variáveis especiais. Veja a tabela com as principais:
Variável | Função |
|---|
$#
| Quantidade de argumentos fornecidos |
$0
| Nome do script (ou caminho, dependendo de como foi invocado) |
$1, $2, ...
| Argumentos posicionais individuais |
$?
| Código de retorno (exit status) do último comando executado |
$$
| PID do processo atual (do shell) |
$!
| PID do último processo executado em segundo plano |
$@
| Todos os argumentos como lista separada |
$*
| Todos os argumentos como uma única string |
A banca explora exatamente essa confusão: as alternativas B, C, D e E apontam para outras variáveis ou conceitos. A alternativa B (nome do arquivo do script) corresponde a $0; a C (path do script) também se relaciona a $0 (quando invocado com caminho relativo/absoluto); a D (nome do usuário) é a variável de ambiente $USER ou $LOGNAME; e a E (bits de permissão) não é acessível por uma variável especial — as permissões são lidas com ls -l ou stat, e o código de retorno de um comando é $?, não os bits de permissão.
Guarde a fronteira entre $# (quantidade) e $0 (nome): é exatamente nela que as alternativas se dividem. A questão é de memorização direta, mas a pegadinha está em associar $# a algo relacionado ao script em si, quando na verdade ela se refere aos argumentos fornecidos.
Alternativa A — ✅ Correta ⟵ GABARITO
A alternativa A afirma que $# armazena "a quantidade de argumentos fornecidos". Isso está correto: $# é uma variável especial do Bash que contém o número de argumentos passados ao script na linha de comando. Por exemplo, ./script.sh a b c faz $# valer 3. É a definição literal da variável.
Alternativa B — ❌ Incorreta
A alternativa B diz que $# armazena "o nome do arquivo do script". Isso é função da variável especial $0, que contém o nome do script (ou o caminho, dependendo de como foi invocado). $# não tem relação com o nome do arquivo — é apenas a contagem de argumentos.
Alternativa C — ❌ Incorreta
A alternativa C afirma que $# armazena "o path do caminho do script". Novamente, isso é atributo de $0 quando o script é invocado com um caminho (ex.: ./script.sh faz $0 valer ./script.sh). $# não armazena caminho algum — apenas a quantidade de argumentos.
Alternativa D — ❌ Incorreta
A alternativa D diz que $# armazena "o nome do usuário que executou o script". O nome do usuário é acessível por variáveis de ambiente como $USER ou $LOGNAME, não por $#. $# é exclusivamente a contagem de argumentos.
Alternativa E — ❌ Incorreta
A alternativa E afirma que $# armazena "os bits relacionados com a permissão do script". As permissões de um arquivo são lidas com comandos como ls -l ou stat, e não há uma variável especial que as armazene. O $? armazena o código de retorno do último comando, mas isso não são bits de permissão. Portanto, a alternativa está totalmente fora do escopo de $#.
Gabarito: letra A — $# é a quantidade de argumentos fornecidos ao script.