명령줄 인수의 합계?

명령줄 인수의 합계?

사용자가 여러 명령줄 인수를 합산하는 데 사용할 수 있지만 호환되지 않는 인수도 무시하는 bash 스크립트를 어떻게 만들 수 있습니까? 예를 들어, 내 스크립트가 sum이라고 가정해 보겠습니다.

sum 10 -argument1 -argument2 -argument3 20

30

sum 7 -argument1 2 -argument2 1 -argument3

10

답변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

답변2

(최적이지 않은) 합계 예:

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

(숫자가 모두 awk허용되는 숫자라고 가정)

예:

./ff 1 2 3.1   0x10 0100
86.1

경고: 숫자로 시작하는 모든 단어는 숫자로 해석됩니다.

답변3

이것은 또 다른 가능성이다

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

명령줄에서 각 인수를 가져와 한 줄에 하나씩 인쇄합니다. 스크립트 awk는 이 데이터를 받아들이고 0이 아닌 양수 값을 추가하여 모든 데이터가 수신된 후 결과를 인쇄합니다.

#!/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.

관련 정보