Cuando ejecuto comandos en mi shell como se muestra a continuación, devuelve un expr: non-integer argument
error. ¿Alguien puede explicarme esto?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Cuando ejecuto comandos en mi shell como se muestra a continuación, devuelve un expr: non-integer argument
error. ¿Alguien puede explicarme esto?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Respuestas:
Esas variables son variables de shell. Para expandirlos como parámetros a otro programa ( es decir expr
), debe usar el $
prefijo:
expr $x / $y
La razón por la que se quejó es porque pensó que estaba tratando de operar con caracteres alfabéticos ( es decir, no enteros)
Si está utilizando el shell Bash, puede lograr el mismo resultado utilizando la sintaxis de expresión:
echo $((x / y))
O:
z=$((x / y))
echo $z
man bash
en el indicador ( q
para salir)
Creo que ya se mencionó en otros hilos:
calc(){ awk "BEGIN { print "$*" }"; }
entonces simplemente puedes escribir:
calc 7.5/3.2
2.34375
En tu caso será:
x=20; y=3;
calc $x/$y
o si lo prefiere, agregue esto como un script separado y póngalo disponible en $ PATH para que siempre lo tenga en su shell local:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
¿Por qué no usar let; Me resulta mucho más fácil. Aquí hay un ejemplo que puede encontrar ú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
Otro ejemplo simple: calcule el número de días desde 1970:
let days=$(date +%s)/86400
El shell predeterminado en la mayoría de las distribuciones de Linux es Bash. En Bash, las variables deben usar un prefijo de signo de dólar para la expansión de parámetros . Por ejemplo:
x=20
y=5
expr $x / $y
Por supuesto, Bash también tiene operadores aritméticos y una sintaxis de expansión aritmética especial , por lo que no es necesario invocar el binario expr como un proceso separado. Puede dejar que el shell haga todo el trabajo de esta manera:
x=20; y=5
echo $((x / y))
expr
se desaconseja en 2013.
Supongamos
x=50
y=5
luego
z=$((x/y))
Esto funcionará correctamente. Pero si desea usar / operator en las declaraciones de caso, entonces no puede resolverlo. En ese caso, use cadenas simples como div o devide u otra cosa. Ver el código
/
funciona bien como una etiqueta de carcasa. Lo que no funciona es usarlo *
para multiplicar sin citarlo, que podría ser lo que realmente hiciste; eso hace que anule efectivamente todos los elementos siguientes en el caso, que en su ejemplo es 'devide' y 'modulo'
Para obtener los números después del punto decimal, puede hacer esto: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div