#!/bin/bash
# Show help function
# Call with: -h
function help(){ cat << EOF
Arguments:
Calculate the sum of several numbers. Example: $sum 19 115 21
10 7 3
As soon as a letter is given in the argument, the program issues an error message.
EOF
}
#Main program
if [ "$1" == "-h" ] ; then
help
exit
fi
check='^[0-9]+$'
if ! [[ $var =~ $check ]] ; then
echo "error: Caution! It is not a number!"
continue
fi
x=${1//[^0-9]/}
sum=0
for ((i=0; i<${#x}; i++));
while [[ num -gt 0 ]];do
var=$(($num % 10))
num=$(($num / 10))
sum=$(($sum + $var))
done
echo $sum
프로그램은 하나 이상의 숫자를 인수로 받아야 하며 지정된 각 숫자의 숫자 합계를 계산해야 합니다. 나는 아무것도 얻지 못했습니다. 프로그램은 어떻게 여러 숫자를 인수로 받고 계산합니까? if 루프와 while을 모두 사용했습니다. 설명은 80자를 초과할 수 없습니다.
답변1
이는 반복적인 접근 방식입니다.숫자숫자를 입력하고 합산합니다.
sum_digits() {
local num=$1 len=${#1} sum=0 digit i
for ((i=0; i<len; i++)); do
digit=${num:i:1}
sum=$((sum + digit))
done
echo "$sum"
}
그 다음에
$ sum_digits 123
6
$ sum_digits 987654321
45
${var:offset:length}
추출할 쉘의 매개변수 확장입니다.하위 문자열변수의 값을 초과합니다.
답변2
내 생각엔 당신이 일을 예상보다 훨씬 더 복잡하게 만들고 있는 것 같아요. 이것이 당신에게 효과가 있는지 확인하십시오
#!/bin/bash
die()
{
echo >&2 "$@"
exit 1
}
usage()
{
echo >&2 "Usage: ....."
die
}
calc()
{
if (( $# < 1 )); then usage; fi
local args="$@";
re='^[0-9]+$'
total=0
for n in ${args[@]}; do
[[ $n =~ $re ]] || die "A non digit was provided"
((total += n))
done
echo "$total"
}
calc "$@"
스크립트를 실행하게 됩니다.
./script 22 20
이것이 당신의 대답입니다.
답변3
참고: 이는 문제에 대한 해결책이 아니며, 이미 가지고 있는 코드를 정리하는 방법과 작동하지 않는 이유를 나타내는 것일 뿐입니다.
첫째, 코드를 일관되게 들여쓰기해야 합니다. 그렇지 않으면 코드가 복잡해 보이고 쉽게 길을 잃을 수 있습니다.
둘째, 구문 오류 없이 코드를 실행하려면 몇 가지 문제를 해결해야 합니다.
- 조건문에 이 빠졌
$
네요num
while
- 누락
do
및done
forfor
루프.
이러한 오류를 수정하고 과도한 공백 줄을 들여쓰기하고 제거하면 코드는 다음과 같습니다.
#!/bin/bash
# Show help function
# Call with: -h
function help(){
cat << EOF
Arguments:
Calculate the sum of several numbers. Example: $sum 19 115 21
10 7 3
As soon as a letter is given in the argument, the program issues an error message.
EOF
}
# Main program
if [ "$1" == "-h" ] ; then
help
exit
fi
check='^[0-9]+$'
if ! [[ $var =~ $check ]] ; then
echo "error: Caution! It is not a number!"
continue
fi
x=${1//[^0-9]/}
sum=0
for ((i=0; i<${#x}; i++)) ; do
while [[ $num -gt 0 ]] ; do
var=$(($num % 10))
num=$(($num / 10))
sum=$(($sum + $var))
done
done
echo $sum
지금은~해야 한다실행되지만 여전히 원하는 작업을 수행하지 않습니다.
첫째, 코드의 어느 부분에도 할당하지 않습니다 num
(할당하지 않음) . var
아마도 각 매개변수에 차례로 할당하려고 할 것입니다.
- 을 할당하지 않으면
var
항상 "이것은 숫자가 아닙니다" 오류가 발생합니다. - 을 할당하지 않으면
num
합계는 항상 0이 됩니다.
답변4
Raku(이전 Perl_6) 사용
raku -e '.put for @*ARGS.map( *.comb).map( *.sum);' 19 115 21 22 20
산출:
10
7
3
4
2
위 내용은 Perl 계열의 언어인 Raku로 작성된 솔루션입니다. 즉, 명령줄 값이 @*ARGS
배열로 허용되고, 각 값이 개별 문자( comb
-ed)로 분할되고, 개별 문자가 sum
병합됩니다.
숫자에 관심이 있는 경우 Raku는 아래의 ("NUmerator DEnominator") 함수 Rat
와 같은 매우 영리한 숫자 함수를 제공합니다.nude
raku -e ' say( .nude, " == ", .Num ) for @*ARGS.map( *.Rat);' 1 2/2 1/2 3/3 2/3 1/3 4/4 3/4 2/4 1/4
산출:
(1 1) == 1
(1 1) == 1
(1 2) == 0.5
(1 1) == 1
(2 3) == 0.6666666666666666
(1 3) == 0.3333333333333333
(1 1) == 1
(3 4) == 0.75
(1 2) == 0.5
(1 4) == 0.25
https://docs.raku.org/언어/variables#index-entry-@*ARGS
https://docs.raku.org/type/Rational
https://raku.org/