Вот как я решил эту проблему.
Пришлось запустить / lib / systemd / systemd-udevd, чтобы восстановить мой / dev / fd (даже если это система openrc, а не systemd).
Понижен до openrc-0.18.4 (был запущен 0.20, который я обнаружил вчера )
emerge -uDav @world
reboot
Похоже, что openrc-0.20 не согласен со мной:)
Один (неоптимальный )пример суммирования:
echo "$@" |awk '{for (i = 1; i <= NF; i++) j+=$i} END {print j}'
(предполагая, что число это все awk
принять как таковое)
Пример:
./ff 1 2 3.1 0x10 0100
86.1
И предупреждение :любое слово, начинающееся с числа, будет интерпретироваться как число
С 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
Вот еще один вариант
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
.