사용자가 명령줄 인수 수의 합계를 계산하는 데 사용할 수 있는 bash 스크립트를 어떻게 생성합니까? 예를 들어, 내 스크립트가 sum이라고 가정해 보겠습니다.
sum 3
삼
sum 3 5
8
sum 9 8 21
38
잠깐만.. 명령줄 인수를 반복하여 합계에 추가해야 한다는 것을 알고 있지만 어떻게 해야 할지 잘 모르겠습니다. 두 번째 명령줄 인수를 특정 변수에 참조하는 방법이나 총 명령줄 인수 수를 가져오는 방법을 잘 모르겠습니다.
답변1
아니요 bash
. 일반 sh
도 사용할 수 있습니다.
#! /bin/sh -
IFS=+; echo "$(($*))"
$*
$IFS
POSIX 셸에서는 첫 번째 문자 ( $IFS
설정되지 않은 경우 공백, 비어 있는 경우 null) 로 구분된 위치 인수(이 경우 스크립트에 대한 인수) 목록으로 확장됩니다 $IFS
. $((...))
쉘의 내부 산술 확산 연산자입니다(10진수, 8진수 및 16진수를 지원합니다).
부동 소수점 지원이 필요한 경우 다음을 사용할 수도 있지만 ksh93
또는 zsh
( 정수 산술 bash
이상의 기능을 지원하는)과 같은 다른 셸이 필요합니다 .bash
awk
#! /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-data
8진수와 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