2
votes

Sortie de script personnalisée sous Unix

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.


0 commentaires

3 Réponses :


3
votes

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.


0 commentaires

0
votes

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


0 commentaires

2
votes

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


0 commentaires