2016-09-09 5 views
0

J'ai un problème chaque fois que j'ajoute plus de 3 nombres avec plusieurs opérateurs. (J'ai essayé expr, bc,Impossible d'ajouter plus de 2 variables

SUM=$(($S1 + $S2 + $S3)) 

et bien d'autres formes, mais chaque fois que j'ai 3 variables j'obtenir cette erreur.

expr: non-integer argument 
expr: syntax error 

C'est quand je le fais avec 2 variables (fonctionne très bien)

#!/bin/sh 
FILE=$1 
while read -r SID FIRST LAST S1 S2 S3 
do 
    SUM=$(expr $S1 + $S2) 
    AVG=$(expr $SUM/3) 
    printf '%d [%d] %s, %s\n' "$AVG" "$SID" "$LAST" "$FIRST" 
done < "$FILE" | sort 

et quand je fais 3 variables (ne fonctionne pas)

#!/bin/sh 
FILE=$1 
while read -r SID FIRST LAST S1 S2 S3 
do 
    SUM=$(expr $S1 + $S2 + $S3) 
    AVG=$(expr $SUM/3) 
    printf '%d [%d] %s, %s\n' "$AVG" "$SID" "$LAST" "$FIRST" 
done < "$FILE" | sort 


expr: non-integer argument 
expr: syntax error 

fichier txt

123456789 Lee Johnson 72 85 90 
999999999 Jaime Smith 90 92 91 
888111818 JC Forney 100 81 97 
290010111 Terry Lee 100 99 100 
199144454 Tracey Camp 77 84 84 
299226663 Laney Camp 70 74 71 
434401929 Skyler Camp 78 81 82 
928441032 Jess Forester 85 80 82 
928441032 Chris Forester 97 94 89 
+0

avez-vous essayé S2 + S3? – John3136

+0

Non. Vous pouvez absolument ajouter trois entiers; Cela signifie simplement que toutes vos variables ne sont pas des entiers. –

+0

À l'avenir, d'ailleurs, n'oubliez pas d'inclure toutes les données nécessaires pour reproduire une erreur dans la question elle-même, plutôt que de demander à quiconque veut tester leur réponse de construire un fichier de données correspondant à votre format. –

Répondre

2

La coquille soutient absolument ce; Ainsi, le problème est avec vos données. Effectuez les opérations suivantes:

s1=1 
s2=2 
s3=3 
echo $((s1 + s2 + s3)) 

... run, et montrant la sortie 6, here.


De même:

s1=1 
s2=2 
s3=3 
expr "$s1" + "$s2" + "$s3" 

... run, et montrant la sortie 6, here.

+2

Je devine sauvagement ici, mais le fichier de données pourrait avoir des fins de ligne de style Windows/DOS (retour chariot + saut de ligne), auquel cas le retour chariot sera inclus dans S3, ce qui n'est pas un nombre entier. Une autre possibilité est que le fichier comporte plus de 6 champs, auquel cas tous les champs supplémentaires seront inclus dans S3, ce qui le rendra non-entier. Nous aurions besoin du fichier de données pour le dire à coup sûr. –