Quando executo comandos no meu shell, como abaixo, ele retorna um expr: non-integer argument
erro. Alguém pode explicar isso para mim?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Quando executo comandos no meu shell, como abaixo, ele retorna um expr: non-integer argument
erro. Alguém pode explicar isso para mim?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Respostas:
Essas variáveis são variáveis de shell. Para expandi-los como parâmetros para outro programa ( ou seja expr
), você precisa usar o $
prefixo:
expr $x / $y
A razão pela qual se queixou é porque achou que você estava tentando operar com caracteres alfabéticos ( ou seja, não inteiro)
Se você estiver usando o shell Bash, poderá obter o mesmo resultado usando a sintaxe da expressão:
echo $((x / y))
Ou:
z=$((x / y))
echo $z
man bash
no prompt ( q
para sair)
Eu acredito que já foi mencionado em outros tópicos:
calc(){ awk "BEGIN { print "$*" }"; }
então você pode simplesmente digitar:
calc 7.5/3.2
2.34375
No seu caso, será:
x=20; y=3;
calc $x/$y
ou, se preferir, adicione-o como um script separado e disponibilize-o em $ PATH para que você sempre o tenha em seu shell local:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Por que não usar let; Acho muito mais fácil. Aqui está um exemplo que você pode achar útil:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Outro exemplo simples - calcule o número de dias desde 1970:
let days=$(date +%s)/86400
O shell padrão na maioria das distribuições Linux é Bash. No Bash, as variáveis devem usar um prefixo de cifrão para a expansão de parâmetros . Por exemplo:
x=20
y=5
expr $x / $y
Obviamente, o Bash também possui operadores aritméticos e uma sintaxe especial de expansão aritmética , portanto, não há necessidade de chamar o binário expr como um processo separado. Você pode deixar o shell fazer todo o trabalho desta maneira:
x=20; y=5
echo $((x / y))
expr
é desencorajado em 2013.
vamos supor
x=50
y=5
então
z=$((x/y))
isso funcionará corretamente. Mas se você quiser usar / operator nas instruções de caso, ele não poderá resolvê-lo. Nesse caso, use strings simples como div ou devide ou qualquer outra coisa. Veja o código
/
funciona bem como um rótulo de caixa de concha. O que não funciona é usar *
para multiplicar sem citá-lo, o que pode ser o que você realmente fez; que faz com que ele efetivamente substitua todos os itens a seguir no caso, que no seu exemplo é 'devide' e 'modulo'
Para obter os números após o ponto decimal, você pode fazer o seguinte: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div