숫자 목록을 명령줄 인수로 사용하고 해당 숫자의 합계를 출력하는 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' "$(( $* ))"