프로그램은 어떻게 여러 숫자를 인수로 취하고 계산합니까? 예: 19 10,13 4, 12 3

프로그램은 어떻게 여러 숫자를 인수로 취하고 계산합니까? 예: 19 10,13 4, 12 3
#!/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

참고: 이는 문제에 대한 해결책이 아니며, 이미 가지고 있는 코드를 정리하는 방법과 작동하지 않는 이유를 나타내는 것일 뿐입니다.


첫째, 코드를 일관되게 들여쓰기해야 합니다. 그렇지 않으면 코드가 복잡해 보이고 쉽게 길을 잃을 수 있습니다.

둘째, 구문 오류 없이 코드를 실행하려면 몇 가지 문제를 해결해야 합니다.

  • 조건문에 이 빠졌 $네요numwhile
  • 누락 dodonefor for루프.

이러한 오류를 수정하고 과도한 공백 줄을 들여쓰기하고 제거하면 코드는 다음과 같습니다.

#!/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/

관련 정보