bash: +=를 사용한 숫자 추가가 필요합니다. 피연산자가 숫자인지 확실하지 않음

bash: +=를 사용한 숫자 추가가 필요합니다. 피연산자가 숫자인지 확실하지 않음

다음 코드를 사용하여 암스트롱 번호를 감지하려고 합니다.

declare -i INPUT=$1


arr=($(fold -w1 <<< "$INPUT"))
for index in "${!arr[@]}"
do
  armstrong_sum+=$((${arr[index]}**${#arr[@]}))
done


echo "$armstrong_sum"

코드를 실행하는 명령 ./armstrong_sum 9: armstrong_sum 10./armstrong_sum 153

출력 9: 10112527

예상 출력 : 91153

암스트롱 수는 각 자릿수의 합을 자릿수로 거듭제곱한 수입니다.

더 중요한 것은 스크립트를 직접 디버깅할 수 있기를 원한다는 것입니다. Bash에서 디버깅하는 방법을 잘 모르겠습니다. 피연산자 유형을 얻고 각 단계에 대해 일시 중지된 반복을 보는 것과 같습니다.

답변1

man bash(강조)에 명시된 바와 같이

정수 속성이 설정된 변수에 +=를 적용하면 값은 산술 표현식으로 평가되고 변수의 현재 값에 추가되며 이 값도 평가됩니다. 복합 할당을 사용하여 배열 변수에 +=를 적용하면(아래 배열 참조) 변수 값은 설정 해제되지 않고(=가 사용될 때처럼) 새 값은 배열의 최대 인덱스보다 1 큰 위치에서 시작됩니다. 배열(인덱스 배열의 경우)에 추가하거나 연관 배열에 추가 키-값 쌍으로 추가합니다. 문자열 값 변수에 적용하면 값이 확장되어 변수 값에 추가됩니다.

당신은 분명히 후자를 얻습니다.

1 + 125 + 27 = 112527

따라서 몇 가지 옵션이 있습니다. armstrong_sum정수로 선언하거나

#!/bin/bash

declare -i INPUT=$1
declare -i armstrong_sum=0

arr=($(fold -w1 <<< "$INPUT"))
for index in "${!arr[@]}"
do
  armstrong_sum+=$(( ${arr[index]}**${#arr[@]} ))
done


echo "$armstrong_sum"

또는 전체 표현식을 (())ie 로 묶어 산술 평가를 보장합니다.

(( armstrong_sum += ${arr[index]}**${#arr[@]} ))

답변2

사용https://www.shellcheck.net(나는 대략적인 내용을 만들기 위해 구문 vim 플러그인으로 사용합니다.통합 개발 환경)

나는 이에 동의합니다.

#!/bin/bash

P="$(echo -n "$1" | wc -c)"
SUM=0;
for X in $(echo "$1" | fold -w 1) ; do
    SUM=$(echo "$SUM+($X^$P)" | bc );
done
echo "$SUM"

"순수한" bash는 아니지만 bash의 장점은 다양한 도구 선택과 가독성 우선순위에 있다는 점입니다.

스택 추적의 경우 모든 스크립트 상단에 다음을 추가하면 오류를 알려줍니다.

set -e
trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR

오류 줄에서 스크립트가 중지되고 출력은 다음과 같습니다.

test.sh: line 7: no: command not found
ERROR: test.sh:7 no + 5

(아마도 자동으로) 오류를 무시하는 대신. 디버깅하려면 -x를 사용하세요.

bash -x armstrong.sh 222
++ echo -n 222
++ wc -c
+ P=3
+ SUM=0
++ fold -w 1
++ echo 222
+ for X in $(echo "$1" | fold -w 1)
++ echo '0+(2^3)'
++ bc
+ SUM=8
+ for X in $(echo "$1" | fold -w 1)
++ echo '8+(2^3)'
++ bc
+ SUM=16
+ for X in $(echo "$1" | fold -w 1)
++ echo '16+(2^3)'
++ bc
+ SUM=24
+ echo 24
24

관련 정보