#!/bin/bash
x=${1//[^0-9]/}
sum=0
for ((i=0; i<${#x}; i++)); do
((sum+=${x:i:1}))
done
echo $sum
저는 리눅스를 처음 접했습니다. 이 코드를 단계별로 설명해 주실 수 있나요? 제가 이해하지 못하는 부분을 굵은 글씨로 보여드리고 싶습니다.
여기에 답이 있습니다.
$ ./summ_of_digits 115
7
작업: 매개변수의 수치적 합을 형성합니다.
- 프로그램 이름은 숫자의 합이다
- 이 프로그램은 하나 이상의 숫자를 인수로 받아 지정된 각 숫자에 대한 숫자의 합을 계산합니다.
- 출력의 각 줄에는 숫자와 그 합계가 포함됩니다.
- 예:
$ digit sum 19 115
19 10
115 7
답변1
x=${1//[^ 0-9]/}
$1
첫 번째 위치 매개변수/명령줄 매개변수입니다.
${var//pattern/replace}
값을 취하고 $var
다음 항목을 모두 바꿉니다.무늬그리고바꾸다. 여기서 패턴은 입니다 [^ 0-9]
. 이는 (*) 사이에 공백이나 0
단일 문자가 없음을 의미합니다. 9
이것대안부분이 비어 있으므로 제거되고 결과가 확장된 다음 에 할당됩니다 x
.
(* ASCII가 아닌 숫자가 포함될 수 있는 로캘에 따라 나중에 스크립트에서 산술 연산을 사용하지 못할 수도 있습니다.)
${#x}
${#var}
변수에 있는 값의 길이입니다.
${x:i:1}
${var:position:count}
다음으로 확장계산다음으로 시작하는 문자위치$var
의 값에 따라 ${x:i:1}
위치에 있는 문자도 마찬가지입니다 i
.
예를 들어 참조하십시오.3.5.3 쉘 매개변수 확장Bash 매뉴얼에 있습니다.
for ((i=0; i<${#x}; i++))
for
이것은 C의 일반적인 루프 형태 와 다소 유사한 산술 루프입니다 . 보다https://www.gnu.org/software/bash/manual/html_node/Looping-Constructs.html
문자 위치는 0부터 인덱싱되므로 string 에서는 위치 2에 있습니다 abc
. c
이것이 바로 루프가 0에서 문자열 길이보다 작은 1로 이동하는 이유입니다.
스크립트가 호출되면 sumscript.sh 123456789
출력이 이라는 것을 쉽게 알 수 있습니다 45
. sumscript.sh 1234x5x6789
산술에 오류가 발생하므로 왜 이 공백을 허용하는지 잘 모르겠습니다.
답변2
x=${1//[^0-9]/}
주어진 스크립트의 첫 번째 인수를 수락하고 숫자가 아닌 문자를 모두 제거합니다.
$ script 123xxx
# `$1` is equal to 123
for ((i=0; i<${#x}; i++)); do
$x
0에서 (3)의 값에서 1의 길이를 뺀 값(2)까지 반복합니다.
# i is equal in the loop to
0
1
2
((sum+=${x:i:1}))
각 루프의 문자열에서 지정된 문자 위치 sum
에 값을 추가합니다 .x
i
0 + 1 = 1
1 + 2 = 3
3 + 3 = 6
따라서 최종 결과 sum
는 6입니다.