$@는 수학 루프에 사용됩니다.

$@는 수학 루프에 사용됩니다.

숫자 목록을 명령줄 인수로 사용하고 해당 숫자의 합계를 출력하는 Bash 스크립트를 작성하려고 합니다.

따라서 스크립트가 실행된 script.sh 1 555 22 122 66다음 모두 요약됩니다. 변수 에 전달한 다음 루프를 실행해야 한다는 것을 알고 있지만 수학을 수행하기 위해 내용을 int로 $@변환하는 방법을 이해하지 못합니다 . $@나는 이것을 시도한다:

#!/bin/bash
for i in $@
do
    $@+$@
    echo "the total is `$@`"
done

답변1

일반적으로 산술 $((...))확장에 인수가 사용되면 자동으로 정수로 변환됩니다. 이 루프는 모든 매개변수를 합산합니다.

for x; do sum=$((sum+x)); done; echo "$sum"

ac 프로그램이 argv[] 배열을 처리할 때 쉘은 모든 인수를 별도의 메모리 위치에 캐시합니다. 쉘 사용자는 배열을 직접 처리할 필요가 없으며, 쉘은 이를 $1, $2, $3 등에 할당하여 도움을 줍니다. 쉘은 또한 "$@"와 같은 목록을 추상화합니다. 마지막으로 구문은 모든 인수를 반복하는 약어입니다 for x.for x in "$@"

인수가 0으로 시작하지 않는 10진수, 0으로 시작하는 8진수 또는 로 시작하는 16진수 0x이고 합계가 오버플로되지 않는다고 가정합니다(64비트 시스템에서는 2^63-1).

이 목록:

$ ./script 12 021 0xab

인쇄됩니다 200(소수점 결과).

답변2

다음 방법으로 이를 수행할 수 있습니다.

tr ' ' '+' <<<"$@" | bc

전달된 모든 인수를 가져와 공백을 기호로 바꾼 +다음 이를 bc.

답변3

인수를 하나씩 나열하십시오.

total=0
while [ -n "$1" ]; do
  total=$((total + "$1"))
  shift
done

또는 for루프를 사용하십시오.

total=0
for argument; do
  total=$((total + "$argument"))
done

답변4

#!/bin/sh

IFS='+'
printf '%s\n' "$*" | bc

시험

$ ./script.sh 1 2 3 -1 30 0.1
35.1

"$*"쉘 변수의 첫 번째 문자로 구분된 위치 인수(명령줄 인수)로 확장됩니다 IFS. plus로 설정 하고 평가할 IFS문자열을 전달합니다 .bc

정수 연산만 필요한 경우:

#!/bin/sh

IFS='+'
printf '%d\n' "$(( $* ))"

관련 정보