Questão de Programação — Linguagens de programação — VUNESP 2026
Programação›Linguagens de programação
Código
gp003714
Banca
VUNESP
Órgão
UNESP
Ano
2026
Cargo
V - - Analista de Informática I - Área de Atuação: Desenvolvimento de Sistemas - Edital nº 350
Considere a execução de um shell script da seguinte
forma:
./script.sh log no-error verbose
É correto afirmar que, dentro do script (script.sh), a
variável $@ irá assumir o valor:
A3
Blog no-error verbose
Cscript.sh
Dscript.sh log no-error verbose
E[script.sh,log no-error,verbose]
Revelar gabarito e comentário▾
GabaritoB — log no-error verbose
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Shell Script: Variáveis Especiais de Parâmetros
Gabarito: letra B. No shell script, a variável $@ representa todos os argumentos passados na linha de comando, excluindo o nome do script. Ao executar ./script.sh log no-error verbose, $@ assume o valor log no-error verbose. Essa é uma das variáveis especiais do shell, que também incluem $0 (nome do script), $# (número de argumentos) e $1, $2, etc. (argumentos individuais).
Para entender completamente essa questão, é fundamental conhecer as variáveis especiais do shell. Quando você executa um script, o shell cria automaticamente algumas variáveis que contêm informações sobre a execução. A mais importante para esta questão é $@, que expande para todos os argumentos passados ao script, cada um como uma palavra separada. Por exemplo, se você executar ./script.sh log no-error verbose, o shell armazenará log em $1, no-error em $2 e verbose em $3. A variável $@ então contém todos esses três argumentos.
É crucial distinguir $@ de outras variáveis relacionadas. $0 contém o nome do script (ou o caminho usado para invocá-lo), $# contém o número de argumentos, e $* também contém todos os argumentos, mas de uma forma ligeiramente diferente. A diferença entre $@ e $* é sutil e importante: $@ trata cada argumento como uma palavra separada, enquanto $* trata todos os argumentos como uma única palavra. Na prática, para a maioria dos casos, ambos produzem o mesmo resultado, mas a distinção se torna relevante quando os argumentos contêm espaços.
Vamos ver um exemplo prático. Suponha que você tenha um script chamado meuscript.sh com o seguinte conteúdo:
#!/bin/bash
echo "Nome do script: $0"
echo "Número de argumentos: $#"
echo "Todos os argumentos: $@"
echo "Primeiro argumento: $1"
echo "Segundo argumento: $2"
Se você executar ./meuscript.sh alfa beta gama, a saída será:
Nome do script: ./meuscript.sh
Número de argumentos: 3
Todos os argumentos: alfa beta gama
Primeiro argumento: alfa
Segundo argumento: beta
A pegadinha desta questão está em confundir $@ com $0 ou com o número de argumentos. A alternativa A (3) corresponde a $#, a alternativa C (script.sh) corresponde a $0, e a alternativa D (script.sh log no-error verbose) corresponde a $0 concatenado com $@. A alternativa E tenta representar os argumentos como uma lista, mas $@ não é uma lista no sentido de uma estrutura de dados; é uma expansão de palavras.
Guarde bem a distinção entre $0, $#, $@ e $*: é exatamente nela que as alternativas desta questão se separam.
Variáveis especiais do shell: $0 (Nome do script); $# (Número de argumentos); $@ (Todos os argumentos (cada um como palavra separada)); $* (Todos os argumentos (como uma única palavra)); $1, $2, ... (Argumentos individuais)
Alternativa A — ❌ Incorreta
O valor 3 corresponde à variável $#, que representa o número de argumentos passados ao script, não os argumentos em si. A questão pergunta pelo valor de $@, que são os argumentos, não a contagem deles.
Alternativa B — ✅ Correta ⟵ GABARITO
A variável $@ expande para todos os argumentos passados na linha de comando, excluindo o nome do script. Como a execução foi ./script.sh log no-error verbose, os argumentos são log, no-error e verbose, e $@ assume exatamente log no-error verbose.
Alternativa C — ❌ Incorreta
O valor script.sh corresponde à variável $0, que contém o nome do script (ou o caminho usado para invocá-lo). $@ não inclui o nome do script; ele contém apenas os argumentos passados após o nome.
Alternativa D — ❌ Incorreta
Esta alternativa combina o nome do script (script.sh) com os argumentos (log no-error verbose). Isso seria o resultado de algo como $0 $@, mas $@ sozinho não inclui o nome do script.
Alternativa E — ❌ Incorreta
Esta alternativa tenta representar os argumentos como uma lista estruturada [script.sh, log no-error, verbose]. No shell, $@ não é uma lista ou array; é uma expansão de palavras separadas por espaços. Além disso, inclui script.sh, que não faz parte de $@.