Lorsque j'exécute les commandes dans mon shell, comme ci-dessous, une erreur expr: non-integer argument
est renvoyée. Quelqu'un pourrait-il me l'expliquer?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Ces variables sont des variables Shell. Pour les développer en tant que paramètres d'un autre programme ( c'est-à-dire expr
), vous devez utiliser le préfixe $
:
expr $x / $y
La raison pour laquelle il s'est plaint est qu'il pensait que vous essayiez d'utiliser des caractères alphabétiques ( c'est-à-dire non-entier)
Si vous utilisez le shell Bash, vous pouvez obtenir le même résultat en utilisant la syntaxe d'expression:
echo $((x / y))
Ou:
z=$((x / y))
echo $z
Je crois que cela a déjà été mentionné dans d'autres discussions:
calc(){ awk "BEGIN { print "$*" }"; }
alors vous pouvez simplement taper:
calc 7.5/3.2
2.34375
Dans votre cas ce sera:
x=20; y=3;
calc $x/$y
ou si vous préférez, ajoutez ceci en tant que script séparé et rendez-le disponible dans $ PATH afin de l'avoir toujours dans votre shell local:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
Pourquoi ne pas utiliser let; Je trouve cela beaucoup plus facile ..__ Voici un exemple que vous pourriez trouver utile:
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
Le shell par défaut sur la plupart des distributions Linux est Bash. Dans Bash, les variables doivent utiliser un préfixe de signe dollar pour expansion du paramètre . Par exemple:
x=20
y=5
expr $x / $y
Bien sûr, Bash a aussi/ opérateurs arithmétiques et une syntaxe spéciale arithmetic expansion , il n’est donc pas nécessaire d’appeler le binaire expr en tant que processus séparé. Vous pouvez laisser le Shell faire tout le travail comme ceci:
x=20; y=5
echo $((x / y))