Pular para o conteúdo principal

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

Sistemas OperacionaisScripts em Unix e Linux
Código
vu197355
Banca
VUNESP
Órgão
EsFCEx
Ano
2023
Cargo
CFO/QC ( )

Considere o seguinte shell script para o sistema operacional Linux:

 

#!/bin/bash
a=1
b=2
if [ $a > $b ]
then
  echo Sim
else
  echo Nao
fi

 

A execução do script acima sem a passagem de nenhum parâmetro produz a seguinte saída no terminal:

  1. ANao
  2. BUm erro de sintaxe é apresentado.
  3. CSim
  4. DSim Nao
  5. ENenhuma (saída vazia).
Revelar gabarito e comentário

GabaritoC — Sim

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: Comparação e Redirecionamento no Bash

Gabarito: letra C. O script imprime "Sim" porque a expressão [ $a > $b ] não realiza uma comparação numérica — o > é interpretado pelo shell como redirecionamento de saída, criando um arquivo vazio chamado $b (ou 2, o valor da variável) e fazendo o teste [ $a ] avaliar se a string 1 é não vazia, o que é verdadeiro. A pegadinha está em confundir o operador de redirecionamento com o operador de comparação do comando test.

O comando [ (também conhecido como test) é um utilitário que avalia expressões condicionais. Para comparar números, ele exige operadores específicos como -eq, -ne, -gt, -lt, -ge, -le. O símbolo > não é um operador de comparação válido dentro do [ ] — ele é um meta-caractere do shell que redireciona a saída padrão de um comando para um arquivo. Quando o shell processa a linha [ $a > $b ], ele primeiro interpreta o redirecionamento: a saída do comando [ $a ] (que é o teste se a string 1 é não vazia) é enviada para um arquivo chamado $b, que após a expansão da variável se torna 2. Como o teste [ $a ] é verdadeiro (a string 1 não é vazia), o comando retorna status 0 (sucesso), e o if executa o bloco then, imprimindo "Sim".

Para entender melhor, vamos analisar o que acontece passo a passo:

  1. O shell expande as variáveis: $a vira 1 e $b vira 2.

  2. O shell identifica o redirecionamento > $b (que virou > 2) e o aplica ao comando [ $a ].

  3. O comando [ 1 ] é executado com sua saída redirecionada para o arquivo 2 (que é criado ou sobrescrito, ficando vazio).

  4. O comando [ 1 ] retorna verdadeiro (status 0), pois a string 1 é não vazia.

  5. O if avalia o status de saída do comando e, como é 0, executa o then, imprimindo "Sim".

Se a intenção fosse comparar os valores numéricos, o script correto seria if [ $a -gt $b ], que retornaria falso (pois 1 não é maior que 2) e imprimiria "Nao". A banca explora exatamente essa confusão entre o operador de redirecionamento > e o operador de comparação -gt.

NÃO CAIA NESSA!

A banca troca o operador de comparação -gt pelo símbolo >, que no shell é redirecionamento. O candidato que conhece a sintaxe correta do test pode até estranhar, mas a pegadinha é mais sutil: o script não dá erro de sintaxe, ele funciona, mas faz algo diferente do que parece. O > redireciona a saída do teste [ $a ] para um arquivo chamado 2, e o teste em si é verdadeiro porque a string 1 é não vazia. É por isso que a alternativa B (erro de sintaxe) é incorreta — o script é válido e executa normalmente.

Alternativa A — ❌ Incorreta

Afirma que a saída seria "Nao". Isso seria o resultado se o script comparasse os números corretamente (1 > 2 é falso). Mas como o > é redirecionamento, o teste [ $a ] é verdadeiro, então o if executa o then. A alternativa confunde o comportamento real do script com o que seria o resultado de uma comparação numérica correta.

Alternativa B — ❌ Incorreta

Afirma que ocorre um erro de sintaxe. O script é sintaticamente válido — o > é um redirecionamento legítimo, e o comando [ $a ] é uma expressão válida. Não há erro de sintaxe; o script executa e imprime "Sim". A alternativa confunde a falta de operador de comparação com um erro de sintaxe, mas o shell não reclama — ele simplesmente interpreta o > como redirecionamento.

Alternativa C — ✅ Correta ⟵ GABARITO

O script imprime "Sim" porque o > é redirecionamento de saída, não comparação. O comando [ $a ] (teste se a string 1 é não vazia) retorna verdadeiro, e sua saída é redirecionada para o arquivo 2. Como o teste é verdadeiro, o if executa o then, imprimindo "Sim". A alternativa captura exatamente o comportamento real do script.

Alternativa D — ❌ Incorreta

Afirma que a saída seria "Sim" seguido de "Nao" em linhas separadas. Isso não acontece porque o if executa apenas um dos blocos — ou o then ou o else, nunca ambos. Como o teste é verdadeiro, apenas "Sim" é impresso. A alternativa inventa uma saída que não corresponde à estrutura do if.

Alternativa E — ❌ Incorreta

Afirma que a saída seria vazia. Isso não ocorre porque o comando [ $a ] retorna verdadeiro (status 0), então o if executa o then, que imprime "Sim". A saída não é vazia — é "Sim". A alternativa confunde o redirecionamento da saída do teste com a saída do script em si.

Gabarito: letra C

Link permanente: /questoes/vu197355