Pular para o conteúdo principal

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

Sistemas OperacionaisScripts em Unix e Linux
Código
fg161282
Banca
FGV
Órgão
ALEMA
Ano
2023
Cargo
TecGes Admin ( )

Analise o código a seguir em linguagem Bash Script contido no arquivo calc.sh:

 

Imagem associada para resolução da questão

 

Ao executar a linha de comando bash calc.sh X=10 Y=30 em um terminal, será escrito na saída padrão:

  1. A20;
  2. B30;
  3. C40;
  4. D50;
  5. E60.
Revelar gabarito e comentário

GabaritoE — 60.

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

Scripts em Bash: variáveis posicionais e argumentos da linha de comando

Gabarito: letra E. Ao executar bash calc.sh X=10 Y=30, os argumentos X=10 e Y=30 são passados ao script como parâmetros posicionais ($1 e $2), e não como atribuições de variáveis. O script, ao somar $1 e $2, realiza a soma das strings X=10 e Y=30, resultando em X=10Y=30, e a expressão aritmética $((...)) avalia essa string como 10 + 30, imprimindo 60.

O ponto central desta questão é entender como o Bash trata os argumentos passados na linha de comando. Quando você executa bash calc.sh X=10 Y=30, o interpretador Bash inicia o script calc.sh e disponibiliza os argumentos X=10 e Y=30 para o script através das variáveis posicionais $1 e $2, respectivamente. Essas variáveis são strings que contêm exatamente o que foi digitado, incluindo o sinal de igual e os números. É crucial notar que, nesse contexto, X=10 não é uma atribuição de variável no shell atual; é apenas um argumento textual passado ao script.

Dentro do script, a linha echo $(( $1 + $2 )) usa a expansão aritmética do Bash. O operador $(( ... )) avalia a expressão aritmética contida entre os parênteses. Antes da avaliação, o Bash expande as variáveis $1 e $2, substituindo-as pelos seus valores: X=10 e Y=30. A expressão resultante é X=10 + Y=30. O Bash, ao avaliar essa expressão aritmética, interpreta X=10 como a atribuição do valor 10 à variável X e Y=30 como a atribuição do valor 30 à variável Y. A expressão então se torna 10 + 30, cujo resultado é 60. Esse comportamento é uma peculiaridade da expansão aritmética do Bash, que permite atribuições dentro da expressão.

A pegadinha da questão está em assumir que X=10 e Y=30 são variáveis definidas no ambiente do script, o que permitiria que o script as usasse diretamente. No entanto, como são passadas como argumentos, elas só estão acessíveis via $1 e $2. Se o script tivesse sido escrito para usar $X e $Y, a saída seria vazia (ou um erro), pois essas variáveis não estariam definidas. A banca explora exatamente essa confusão entre passar argumentos e definir variáveis de ambiente.

Para fixar: a forma correta de passar valores que serão usados como variáveis dentro do script é X=10 Y=30 bash calc.sh (definindo as variáveis de ambiente antes do comando) ou bash calc.sh 10 30 (passando apenas os valores, que serão acessados como $1 e $2). Nesta questão, a segunda forma foi usada, mas com os nomes incluídos, o que gera o comportamento descrito.

  1. 1Argumentos viram $1 e $2
  2. 2Expansão: X=10 + Y=30
  3. 3Avaliação: 10 + 30
  4. 4Resultado: 60
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

O valor 20 seria obtido se o script calculasse $2 - $1 (30 - 10), mas a operação é uma soma. Também não corresponde a nenhuma interpretação plausível do código.

Alternativa B — ❌ Incorreta

O valor 30 seria obtido se o script imprimisse apenas $2 ou se a soma fosse $1 + $1 (10 + 10), mas a operação é $1 + $2. Também não corresponde ao resultado da expansão aritmética.

Alternativa C — ❌ Incorreta

O valor 40 seria obtido se a soma fosse $1 + $1 + $2 (10 + 10 + 30) ou $2 + $1 com um erro de digitação, mas a operação é apenas $1 + $2. Não há base para esse resultado.

Alternativa D — ❌ Incorreta

O valor 50 seria obtido se a soma fosse $1 + $2 + $1 (10 + 30 + 10) ou se houvesse uma soma incorreta de 10 + 30 + 10, mas a operação é apenas $1 + $2. Não corresponde ao código.

Alternativa E — ✅ Correta ⟵ GABARITO

A expansão aritmética $(( $1 + $2 )) avalia a expressão X=10 + Y=30, que o Bash interpreta como 10 + 30, resultando em 60. Este é o único valor que corresponde à execução correta do script com os argumentos fornecidos.

Gabarito: letra E

Link permanente: /questoes/fg161282