Il y a une question pour ajouter les arguments du script CLI puis les afficher au format suivant:
#!/bin/bash
sum=0
for i in $@;
do
sum=$((sum+i));
done
echo $sum
exit 0
Si l'entrée est:
$ sum_for 10 20 30
Le script que j'ai écrit est:
10 + 20 + 30 = 60
Ce qui produit juste la somme, comme indiqué ci-dessus. Pouvez-vous s'il vous plaît m'aider à imprimer la sortie comme indiqué ci-dessus.
3 Réponses :
Vous pouvez simplement construire la chaîne de sortie à la volée, avec quelque chose comme:
pax> ./some_for 5 6 72 x 6x x6 -3 +4 --4 ++7 -+3 +-4 "" + - 4 WARNING, ignoring non-integer 'x'. WARNING, ignoring non-integer '6x'. WARNING, ignoring non-integer 'x6'. WARNING, ignoring non-integer '+4'. WARNING, ignoring non-integer '--4'. WARNING, ignoring non-integer '++7'. WARNING, ignoring non-integer '-+3'. WARNING, ignoring non-integer '+-4'. WARNING, ignoring non-integer ''. WARNING, ignoring non-integer '+'. WARNING, ignoring non-integer '-'. 5 + 6 + 72 + -3 + 4 = 84
Cela peut être vu en action ainsi:
#!/bin/bash
((sum = 0))
text=""
prefix=""
for i in "$@" ; do
if [[ $i =~ ^-?[0-9]+$ ]] ; then
((sum = sum + i))
text="${text}${prefix}${i}"
prefix=" + "
else
echo "WARNING, ignoring non-integer '${i}'."
fi
done
echo "${text} = ${sum}"
Et, si vous souhaitez le rendre relativement robuste aux mauvaises données d'entrée, vous pouvez essayer:
pax> ./sum_for 5 6 72 5 + 6 + 72 = 83
Voici un exemple d'exécution avec divers éléments de données non valides:
#!/bin/bash
((sum = 0)) # I like spacing expressions :-)
text="" # Initial text
prefix="" # and term prefix.
for i in "$@" ; do # Handle each term
((sum = sum + i)) # by accumulating
text="${text}${prefix}${i}" # and adding to expression.
prefix=" + " # Adjust term prefix to suit.
done
echo "${text} = ${sum}" # Output expression and result.
Cela n'autorise pas certaines valeurs que vous voudrez peut- être autoriser, mais j'ai opté pour uniquement des nombres dans leur forme la plus simple, comme 4 au lieu de +4 , ou --4 , ou même ++++----+--+4 :-)
Changer ce qui est autorisé est une question (relativement) simple de changer le filtre d'expression régulière.
En utilisant printf vous pouvez faire quelque chose comme
#!/bin/bash
sum=0
for ((i=1; i <= $#; i++))
do
((sum += ${!i})) # sum with indirection
printf '%*.*s%d' 0 $(( i==1 ? 0 : 3)) ' + ' ${!i} # use variable width
done
printf ' = %d\n' $sum
Vous pouvez passer tous les arguments du shell, en tant que variable dans awk et obtenir la somme pour tous dans sa section BEGIN.
cat code.sh
var="$@"
awk -v value="$var" 'BEGIN{z=split(value,a," ");for(i=1;i<=z;i++){s+=a[i]};print s}'