Сумма аргументов командной строки?

Вот как я решил эту проблему.

Пришлось запустить / lib / systemd / systemd-udevd, чтобы восстановить мой / dev / fd (даже если это система openrc, а не systemd).

Понижен до openrc-0.18.4 (был запущен 0.20, который я обнаружил вчера )

emerge -uDav @world

reboot

Похоже, что openrc-0.20 не согласен со мной:)

0
22.11.2018, 16:08
3 ответа

Один (неоптимальный )пример суммирования:

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

(предполагая, что число это все awkпринять как таковое)

Пример:

./ff 1 2 3.1   0x10 0100
86.1

И предупреждение :любое слово, начинающееся с числа, будет интерпретироваться как число

0
28.01.2020, 02:41

С awkпри условии, что сумма и каждый отдельный числовой аргумент могут соответствовать типу longвашей системы, и учитываются только последовательности десятичных цифр с необязательным начальным -знаком:

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

Для произвольной точности можно использоватьbc:

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

Пример:

$./sum1 999999999999999999999999 1
999999999999999983222784
$./sum2 999999999999999999999999 1
1000000000000000000000000
1
28.01.2020, 02:41

Вот еще один вариант

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

Он берет каждый аргумент из командной строки и выводит его по одному на строку. Сценарий awkпринимает эти данные и складывает отличные от -нулевые положительные значения, выводя результат после получения всех данных

Пример

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

./sum 1 -argument2 2 -argument4 3
6

Если бы вы могли гарантировать, что ваши числовые аргументы содержат только цифры, вы могли бы упростить проверочное выражение с $1 ~ /^[[:digit:]]+$/до $1+0 > 0.

0
28.01.2020, 02:41

Теги

Похожие вопросы