Eu quero dividir uma soma de números por um valor

1

Então aqui está o meu código para shell script do Unix

#! /bin/ksh

echo "Enter your first number:"    
read first

echo "Enter your second number:"    
read second

echo "Enter your third number:"    
read third

SUM='expr $first + $second + $third'    
AVERAGE="$SUM/3"

echo "The average is $AVERAGE"

Basicamente, quero encontrar a média dos 3 valores que um usuário insere. O resultado que obtenho depois de inserir todos os valores, por exemplo, todos os valores somam 12; é "A média é 12/3".

    
por den 02.10.2014 / 14:26

3 respostas

4

A resposta do slm aqui não levou em conta que você perguntou sobre o shell Korn, não sobre o shell Bourne Again. O shell do Korn (93) não possui o comando expr integrado, portanto, ao usar expr nos shell scripts do Korn, você está usando um comando expr externo. Isto não é um problema em si. Afinal, é como alguém fez as coisas com o shell Bourne, que também não tinha o comando interno expr . Mas, como M. Kohen aponta, pode-se preferir usar os built-ins de shell quando um shell os possui. E o shell Korn tem.

M. Kohen aponta para a substituição aritmética disponível no shell Korn. É importante lembrar que este é uma substituição, então você deve fazer algo com o resultado substituído se não quiser apenas executá-lo como um comando. A forma mais completa da resposta de M. Kohen (corrigir o erro de precedência do operador ao longo do caminho) é assim:

AVERAGE="$(( (first + second + third) / 3))"

Mas há duas outras maneiras de fazer isso no shell Korn. O shell Korn tem um comando interno chamado let que faz avaliação aritmética em cada um dos seus argumentos:

let "AVERAGE = (first + second + third) / 3"

Todos os argumentos para o comando são uma única expressão, portanto, espaços em branco precisam ser citados como aqui.

Ele também tem uma parte da sintaxe que é descrita em um manual do clone do ksh como "açúcar sintático para let " com a expressão transformada em um único argumento para esse comando:

(( AVERAGE = (first + second + third) / 3 ))

Leitura adicional

por 05.10.2014 / 00:04
3

Você pode usar o suporte aritmético integrado no shell usado por um parêntese duplo precedido por um sinal de dólar:

$(( (first + second + third) / 3))

Isso é mais eficiente que expr , já que não requer um processo separado (e, portanto, bifurcação, exec, gerenciamento de tubos e retorno).

    
por 02.10.2014 / 17:21
2

Sua pergunta originalmente não tinha a tag Korn Shell, então eu a adicionei. Se você estivesse usando o Bash, o seguinte se aplicaria.

O comando expr pode executar uma variedade de cálculos matemáticos. Basta usá-lo para realizar a média também.

$ AVG=$(expr $SUM / 3)

Além disso, você normalmente desejará usar essa forma de subcomandos, $(...cmd...) , em vez de backticks. Então, mude sua linha SUM= para isso:

SUM=$(expr $first + $second + $third)

Se você não tiver certeza do que um comando em particular pode fazer por você, verifique as man pages. O comando expr tem todas as operações que ele pode realizar, man expr .

Referências

por 02.10.2014 / 15:58