Questão de Sistemas Operacionais — Geral — VUNESP 2024
Sistemas Operacionais›Geral
Código
vu212431
Banca
VUNESP
Órgão
EsFCEx
Ano
2024
Cargo
CFO/QC ( )
O seguinte shell script para bash, no sistema operacional Linux, solicita que o usuário digite um número natural e informa se ele é par ou ímpar. Um trecho do script foi propositalmente ocultado e substituído pela lacuna indicada por “_____”.
#!/bin/bash read -p "Digite um número: " n if [ _____ -eq 0 ] then echo "Par" else echo "Ímpar" fi
Para que o script funcione corretamente, o conteúdo da lacuna deve ser
A((n/2))
B((n/2))
C(n%2)
Dn mod 2
E$((n%2))
Revelar gabarito e comentário▾
GabaritoE — $((n%2))
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 no Linux: operadores aritméticos e teste condicional
Gabarito: letra E. Para que o script funcione corretamente, a lacuna deve ser preenchida com $((n%2)), pois essa é a sintaxe correta do bash para realizar a operação de módulo (resto da divisão) e retornar o resultado para ser comparado com -eq 0 no comando test (representado pelos colchetes). As demais alternativas ou usam sintaxe incorreta, ou não produzem o resultado esperado.
O script em questão utiliza o comando read para capturar a entrada do usuário e armazená-la na variável n. Em seguida, a estrutura if [ condição ] avalia uma condição usando o comando test. Dentro dos colchetes, a expressão $((n%2)) é avaliada como uma expansão aritmética, que calcula o resto da divisão de n por 2. Se o resultado for 0, o número é par; caso contrário, é ímpar. A expansão aritmética $((...)) é a forma padrão do bash para realizar cálculos com números inteiros, e o operador % é o operador de módulo.
É importante entender a diferença entre as várias formas de avaliar expressões no bash. A expansão aritmética $((expressão)) é a mais comum e versátil, permitindo operações como adição, subtração, multiplicação, divisão e módulo. O comando let e a construção ((expressão)) também realizam aritmética, mas com nuances diferentes. No contexto do comando test (colchetes), a expansão aritmética é a forma mais adequada, pois retorna o valor numérico da expressão, que pode então ser comparado com -eq 0.
A pegadinha desta questão está em reconhecer a sintaxe correta da expansão aritmética e do operador de módulo. Muitos candidatos podem se confundir com a sintaxe de outras linguagens ou com formas alternativas de cálculo no bash. A alternativa (n%2) parece correta, mas sem os $((...)) o bash não realiza a expansão aritmética, e a expressão é tratada como texto literal. Da mesma forma, n mod 2 é uma sintaxe de outras linguagens, não do bash. A alternativa ((n/2)) usa a construção ((...)), que é válida para aritmética, mas a divisão inteira não é o que precisamos para verificar paridade; precisamos do resto da divisão. A alternativa $(($n/2)) tem um erro de sintaxe: o $ antes de n não é necessário dentro da expansão aritmética, e a divisão inteira também não resolve o problema.
Para verificar se um número é par ou ímpar, precisamos calcular o resto da divisão por 2. Se o resto for 0, o número é par; se for 1, é ímpar. O operador % é o operador de módulo, que retorna exatamente esse resto. Portanto, a expressão correta é $((n%2)), que calcula o resto da divisão de n por 2 e retorna o valor para a comparação.
1$((expressão)) — expansão (retorna valor)
2((expressão)) — avaliação (status de saída)
3let expressão — atribuição
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
A alternativa ((n/2)) usa a construção ((...)), que é uma forma válida de aritmética no bash, mas a operação é de divisão inteira, não de módulo. Para n=3, ((n/2)) resultaria em 1, que não é igual a 0, e o script diria "Ímpar" (correto). Mas para n=4, ((n/2)) resultaria em 2, que também não é igual a 0, e o script diria "Ímpar" (incorreto). Portanto, a divisão inteira não serve para verificar paridade.
Alternativa B — ❌ Incorreta
A alternativa $(($n/2)) tem dois problemas: primeiro, o $ antes de n é desnecessário dentro da expansão aritmética $((...)); segundo, a operação é de divisão inteira, não de módulo. Mesmo que a sintaxe estivesse correta, a divisão inteira não produziria o resultado esperado para a verificação de paridade.
Alternativa C — ❌ Incorreta
A alternativa (n%2) parece correta à primeira vista, mas sem os $((...)) o bash não realiza a expansão aritmética. Dentro dos colchetes do comando test, a expressão (n%2) seria interpretada como uma string literal, e a comparação [ (n%2) -eq 0 ] falharia com um erro de sintaxe ou comportamento inesperado.
Alternativa D — ❌ Incorreta
A alternativa n mod 2 usa uma sintaxe que não é do bash. O operador mod não existe no bash; o operador de módulo é %. Além disso, sem a expansão aritmética $((...)), a expressão seria tratada como texto literal.
Alternativa E — ✅ Correta ⟵ GABARITO
A alternativa $((n%2)) usa a expansão aritmética correta do bash para calcular o resto da divisão de n por 2. O resultado é 0 para números pares e 1 para números ímpares, que é exatamente o que a condição -eq 0 verifica. Esta é a forma padrão e correta de realizar essa operação em um script bash.
PEGA ESSA DICA!
Para questões de shell script, memorize as três formas de aritmética no bash: $((expressão)) para expansão aritmética (retorna o valor), ((expressão)) para avaliação aritmética (retorna status de saída) e let expressão para atribuição. O operador de módulo é sempre %. Quando a questão pedir para verificar paridade, lembre-se de que precisa do resto da divisão, não do quociente.