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
vu212380
Banca
VUNESP
Órgão
CM Campinas
Ano
2024
Cargo
Ana Leg ( )

No sistema operacional Linux, o seguinte shell script para bash verifica se alguns servidores na rede estão ativos por meio do comando ping.

 

#!/bin/bash

 

for i in 0{1..4}

do

  h= srv${i}

  ping -c 1 -q $h &>/dev/null

  if [ $? -eq 0 ]

  then

    echo servidor $h respondeu

  else

    echo servidor $h nao respondeu.

  fi

done

 

Com base no código apresentado, os nomes dos servidores que são testados durante a execução do script são exclusivamente:

  1. Asrv01, srv02, srv03 e srv04.
  2. Bsrv01 e srv04.
  3. Csrv0, srv1 e srv4.
  4. Dsrv0, srv1, srv2, srv3 e srv4.
  5. Esrv1, srv2, srv3 e srv4.
Revelar gabarito e comentário

GabaritoA — srv01, srv02, srv03 e srv04.

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 e Expansão de Chaves no Bash

Gabarito: letra A. O loop for i in 0{1..4} gera os valores 01, 02, 03 e 04 — a expansão de chaves {1..4} produz a sequência 1 2 3 4, e o prefixo 0 é concatenado a cada elemento. Assim, os servidores testados são exclusivamente srv01, srv02, srv03 e srv04.

O coração da questão é a expansão de chaves (brace expansion), um recurso do Bash que gera uma lista de strings a partir de um padrão entre chaves {}. Quando você escreve {1..4}, o shell expande isso para 1 2 3 4 — uma sequência numérica crescente. O prefixo 0 antes das chaves é apenas um texto literal que se junta a cada elemento expandido, resultando em 01 02 03 04. É por isso que o nome do servidor fica srv01, com zero à esquerda, e não srv1.

Esse mecanismo é diferente da expansão de variáveis ($i) ou da expansão aritmética ($((i+1))). Na expansão de chaves, o shell interpreta o padrão {início..fim} e gera todos os valores intermediários — não é uma iteração numérica como em outras linguagens, mas uma geração de strings. O comando for i in 0{1..4} simplesmente percorre a lista já expandida: 01, 02, 03, 04.

Na prática, o script monta o nome do host com h=srv${i}. Para cada valor de i, o nome vira srv01, srv02, srv03 e srv04. O comando ping -c 1 -q $h envia um único pacote ICMP de forma silenciosa, e o if [ $? -eq 0 ] verifica se o comando anterior teve sucesso (código de saída 0), indicando que o servidor respondeu. O &>/dev/null descarta toda a saída, tanto padrão quanto de erro.

A pegadinha que a banca explora aqui é justamente a expansão de chaves com prefixo zero. Muitos candidatos leem 0{1..4} como se fosse {01..04} ou interpretam como uma iteração de 1 a 4 sem o zero, caindo na alternativa E (srv1, srv2, srv3, srv4). Outros podem pensar que o 0 é um separador ou que a expansão inclui o 0 isolado, gerando srv0 — o que não ocorre, pois o 0 é prefixo fixo, não um valor da sequência.

Guarde a distinção: {1..4} gera 1 2 3 4; 0{1..4} gera 01 02 03 04; {01..04} também geraria 01 02 03 04 (com zero à esquerda por causa do formato), mas a sintaxe do script usa o prefixo. É exatamente essa nuance que separa as alternativas.

  1. 10{1..4}
  2. 201 02 03 04
  3. 3srv01…srv04
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

A expansão 0{1..4} produz exatamente 01, 02, 03 e 04. O prefixo 0 é concatenado a cada número da sequência {1..4}, resultando nos nomes srv01, srv02, srv03 e srv04. Não há srv00 nem srv05 — a sequência vai de 1 a 4, e o zero é apenas o dígito que preenche a dezena.

Alternativa B — ❌ Incorreta

Afirma que apenas srv01 e srv04 são testados. Isso ignoraria os servidores srv02 e srv03, que também são gerados pela expansão {1..4}. A sequência completa inclui todos os valores intermediários, não apenas os extremos.

Alternativa C — ❌ Incorreta

Lista srv0, srv1 e srv4. Aqui há dois erros: primeiro, o 0 não é um valor da sequência — é um prefixo fixo; segundo, a expansão {1..4} gera todos os números de 1 a 4, não apenas 1 e 4. O nome srv0 jamais seria formado, pois o 0 não aparece como elemento isolado da expansão.

Alternativa D — ❌ Incorreta

Inclui srv0 na lista, o que está errado. O 0 é o prefixo concatenado a cada valor da sequência, não um valor em si. A expansão 0{1..4} não produz srv0 — produz srv01, srv02, srv03 e srv04.

Alternativa E — ❌ Incorreta

Lista srv1, srv2, srv3 e srv4, sem o zero à esquerda. Isso seria o resultado de srv{1..4} (sem o prefixo 0). No script, o prefixo 0 está presente, então os nomes corretos são srv01, srv02, srv03 e srv04. A banca explora exatamente essa confusão entre srv{1..4} e 0{1..4}.

NÃO CAIA NESSA!

A banca troca a expansão com prefixo zero (0{1..4}01 02 03 04) pela expansão sem prefixo ({1..4}1 2 3 4). O candidato que lê rápido enxerga srv1, srv2, srv3, srv4 e marca a letra E, mas o 0 antes das chaves é um caractere literal que se junta a cada número. Fique atento: o prefixo não é um valor da sequência, é parte do nome.

PEGA ESSA DICA!

Para não errar, teste mentalmente a expansão: escreva echo 0{1..4} no terminal e veja a saída 01 02 03 04. Sempre que vir {a..b}, lembre-se de que o shell gera todos os valores entre a e b — e qualquer texto antes das chaves é concatenado a cada um deles. Na prova, se a alternativa não tiver o zero à esquerda, ela está descrevendo outra expansão.

Gabarito: letra A — os servidores testados são srv01, srv02, srv03 e srv04.

Link permanente: /questoes/vu212380