Pular para o conteúdo principal

Questão de Sistemas Operacionais — Scripts em Unix e Linux — VUNESP 2024

Sistemas OperacionaisScripts em Unix e Linux
Código
vu212382
Banca
VUNESP
Órgão
Pref Santo André
Ano
2024
Cargo
ATI ( )

Um arquivo shell script com o nome script.sh é executado com o seguinte comando:

 

./script.sh 1 2 3

 

Dentro do arquivo existe a seguinte linha de código:

 

echo $@

 

É correto afirmar que o valor impresso por essa linha de código será:

  1. Ascript.sh
  2. B1
  3. C3
  4. D123
  5. E1 2 3
Revelar gabarito e comentário

GabaritoE — 1 2 3

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”.

Resolução

Gabarito: letra E — a conta chega a 1 2 3 — alternativa E.

A ideia por trás

Em shell script, os valores passados na linha de comando ficam guardados em variáveis especiais chamadas parâmetros posicionais. O primeiro argumento vai para $1, o segundo para $2, e assim por diante. Além deles, existem variáveis que representam o conjunto todo: $@ e $*. A variável $0 guarda o nome do script, e $# guarda a quantidade de argumentos.

A variável $@ expande para todos os argumentos, cada um como uma palavra separada. Quando usada sem aspas, o shell a substitui pela lista de argumentos separados por espaços. Já semaspastambeˊmproduzamesmaapare^ncia,masentreaspasduplasadiferenc\caaparece:"* sem aspas também produz a mesma aparência, mas entre aspas duplas a diferença aparece: "@" preserva cada argumento como palavra independente, enquanto "$*" junta tudo em uma única palavra. Nesta questão, como $@ está sem aspas, o resultado é simplesmente os argumentos separados por espaços.

A questão testa se você sabe o que $@ representa: não é o nome do script, nem um argumento isolado, nem a concatenação sem espaços, mas sim a lista completa de argumentos. Basta expandir $@ e ver o que o echo imprime.

O que a questão dá

  • comando de execução: ./script.sh 1 2 3

  • linha de código: echo $@

O que queremos: o valor impresso pela linha echo $@

Passo 1 — Identificar os argumentos passados ao script

Para saber o que $@ vai imprimir, primeiro precisamos saber quais argumentos foram passados. O comando ./script.sh 1 2 3 passa três argumentos: 1, 2 e 3. Eles ficam guardados em $1, $2 e $3.

1 ,2,3\boxed{1\ , 2, 3}
NÃO CAIA NESSA!

Confundir $0 (nome do script) com os argumentos. $0 é ./script.sh, mas não é usado aqui.

Passo 2 — Expandir $@ para a lista de argumentos

Agora que sabemos quais são os argumentos, precisamos ver o que $@ faz com eles. $@ é uma variável especial que se expande para todos os argumentos, cada um como uma palavra separada, preservando os espaços entre eles. Isso é diferente de $1 (primeiro argumento), $# (quantidade) e $0 (nome do script).

NÃO CAIA NESSA!

Achar que $@ concatena os números sem espaços, como 123. Na verdade, ele preserva os espaços entre os argumentos.

Passo 3 — Ver o que o echo imprime com $@

O comando echo recebe a expansão de $@. Como $@ está sem aspas, o shell o substitui pela lista de argumentos separados por espaços: 1 2 3. O echo então imprime exatamente essa string.

1 23\boxed{1\ 2 3}
NÃO CAIA NESSA!

Confundir com $# que daria 3, ou com $1 que daria 1. $@ é o conjunto todo.

Resposta: 1 2 3 — alternativa E

Link permanente: /questoes/vu212382