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}'