여러 명령줄 인수를 합산하는 bash 스크립트를 만드는 방법은 무엇입니까?

여러 명령줄 인수를 합산하는 bash 스크립트를 만드는 방법은 무엇입니까?

사용자가 명령줄 인수 수의 합계를 계산하는 데 사용할 수 있는 bash 스크립트를 어떻게 생성합니까? 예를 들어, 내 스크립트가 sum이라고 가정해 보겠습니다.

sum 3

sum 3 5

8

sum 9 8 21

38

잠깐만.. 명령줄 인수를 반복하여 합계에 추가해야 한다는 것을 알고 있지만 어떻게 해야 할지 잘 모르겠습니다. 두 번째 명령줄 인수를 특정 변수에 참조하는 방법이나 총 명령줄 인수 수를 가져오는 방법을 잘 모르겠습니다.

답변1

아니요 bash. 일반 sh도 사용할 수 있습니다.

#! /bin/sh -
IFS=+; echo "$(($*))"

$*$IFSPOSIX 셸에서는 첫 번째 문자 ( $IFS설정되지 않은 경우 공백, 비어 있는 경우 null) 로 구분된 위치 인수(이 경우 스크립트에 대한 인수) 목록으로 확장됩니다 $IFS. $((...))쉘의 내부 산술 확산 연산자입니다(10진수, 8진수 및 16진수를 지원합니다).

부동 소수점 지원이 필요한 경우 다음을 사용할 수도 있지만 ksh93또는 zsh( 정수 산술 bash이상의 기능을 지원하는)과 같은 다른 셸이 필요합니다 .bashawk

#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}

long이는 (정수의 경우) 구현된 시스템 과 double(부동 소수점의 경우) 유형 숫자를 사용합니다. 입력한 숫자는 십진수 부동 소수점 또는 영국 공학 표기법이어야 합니다(부동 소수점 구분 기호는 다음과 같습니다).기간로케일에 관계없이 문자). 일부 구현의 경우 첫 번째 숫자가 음수이면 이를 옵션으로 해석하려는 시도가 이루어지기 awk때문에 실패합니다 .awk

POSIXLY_CORRECT가 환경에 존재할 때 일부 awk구현(예: GNU)은 이진 지수 표기법을 포함한 16진수도 지원합니다 . awk또는 --non-decimal-data8진수와 16진수를 이해하는 를 사용하세요.

$ POSIXLY_CORRECT=1 ./sum  0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum  010
8

답변2

다음 bash 기능을 사용할 수 있습니다.

sum() {
    local sum=0
    for arg in "$@"; do
        (( sum += arg ))
    done   
    echo $sum
}

답변3

비순환적 변형:

{ printf %d+ "$@"; echo 0; } | bc

위 내용을 스크립트 파일인 sum.

#!/bin/bash

{ printf %d+ "$@"; echo 0; } | bc

다음과 같이 실행하세요:

$ ./sum 4
4
$ ./sum 4 4 5
13

관련 정보