Lorsque j'exécute des commandes dans mon shell comme ci-dessous, cela renvoie une expr: non-integer argument
erreur. Quelqu'un pourrait-il me l'expliquer?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Lorsque j'exécute des commandes dans mon shell comme ci-dessous, cela renvoie une expr: non-integer argument
erreur. Quelqu'un pourrait-il me l'expliquer?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Réponses:
Ces variables sont des variables shell. Pour les étendre en tant que paramètres à 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 parce qu'il pensait que vous essayiez d'opérer sur des caractères alphabétiques ( c'est -à- dire non entiers)
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
man bash
à l'invite ( q
pour quitter)
Je crois que cela a déjà été mentionné dans d'autres fils:
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 que vous l'ayez toujours dans votre shell local:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
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
Un autre exemple simple - calculer le nombre de jours depuis 1970:
let days=$(date +%s)/86400
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 l' expansion des paramètres . Par exemple:
x=20
y=5
expr $x / $y
Bien sûr, Bash a également des opérateurs arithmétiques et une syntaxe d'expansion arithmétique spéciale , il n'est donc pas nécessaire d'invoquer le binaire expr comme un processus séparé. Vous pouvez laisser le shell faire tout le travail comme ceci:
x=20; y=5
echo $((x / y))
expr
est déconseillé en 2013.
Supposons
x=50
y=5
puis
z=$((x/y))
cela fonctionnera correctement. Mais si vous souhaitez utiliser / operator dans les instructions case, il ne peut pas le résoudre. Dans ce cas, utilisez des chaînes simples comme div ou devide ou autre chose. Voir le code
/
fonctionne bien comme une étiquette de coque. Ce qui ne fonctionne pas, c'est d'utiliser *
pour multiplier sans le citer, ce qui pourrait être ce que vous avez réellement fait; qui l' amène à remplacer efficacement tous les éléments suivants dans le cas, qui dans votre exemple est 'devide' et 'modulo'
Pour obtenir les nombres après la virgule décimale, vous pouvez faire ceci: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div