Soma dos argumentos da linha de comando?

0

Como eu criaria um script bash que o usuário possa usar para somar qualquer quantidade de argumentos de linha de comando, mas também irá ignorar argumentos incompatíveis? Por exemplo, digamos que meu script seja chamado de soma:

sum 10 -argument1 -argument2 -argument3 20

30

sum 7 -argument1 2 -argument2 1 -argument3

10

    
por Calin Chaly 22.11.2018 / 14:04

3 respostas

1

Com awk , supondo que a soma e cada argumento de número individual possam caber no tipo long do seu sistema e considerando apenas sequências de dígitos decimais com um sinal - inicial opcional:

#! /bin/sh -
awk 'BEGIN{
  sum = 0
  for (i = 1; i < ARGC; i++)
    if (ARGV[i] ~ /^-?[0123456789]+$/)
      sum += ARGV[i]
  print sum}' "$@"

Para precisão arbitrária, você pode usar bc :

#! /bin/sh -
awk 'BEGIN{
  for (i = 1; i < ARGC; i++)
    if (ARGV[i] ~ /^-?[0123456789]+$/)
      print "s+="ARGV[i]
  print "s"}' "$@" | bc

Exemplo:

$ ./sum1 999999999999999999999999 1
999999999999999983222784
$ ./sum2 999999999999999999999999 1
1000000000000000000000000
    
por 22.11.2018 / 14:16
0

Um exemplo (não ideal) para fazer a soma:

echo "$@" |awk '{for (i = 1; i <= NF; i++) j+=$i} END {print j}'

(assumindo que o número é tudo awk aceita como tal)

Exemplo:

./ff 1 2 3.1   0x10 0100
86.1

E aviso: qualquer palavra que comece com número será interpretada como número

    
por 22.11.2018 / 14:19
0

Aqui está outra possibilidade

printf "%s\n" "$@" | awk '$1 ~ /^[[:digit:]]+$/ {s+=$1} END {print s}'

Leva cada argumento da linha de comando e o imprime, um por linha. O script awk aceita esses dados e adiciona valores positivos diferentes de zero, imprimindo o resultado quando recebe todos os dados

Exemplo

#!/bin/sh
printf "%s\n" "$@" | awk '$1 ~ /^[[:digit:]]+$/ {s+=$1} END {print s}'

./sum 1 -argument2 2 -argument4 3
6

Se você pudesse garantir que seus argumentos numéricos continham apenas dígitos, você poderia simplificar a expressão de verificação de $1 ~ /^[[:digit:]]+$/ para $1+0 > 0 .

    
por 22.11.2018 / 15:14