다음 명령은 무엇을 의미합니까? x=${1//[^0-9]/} 및 ${#x}

다음 명령은 무엇을 의미합니까? x=${1//[^0-9]/} 및 ${#x}
#!/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$x0에서 (3)의 값에서 1의 길이를 뺀 값(2)까지 반복합니다.

# i is equal in the loop to
0
1
2

((sum+=${x:i:1}))각 루프의 문자열에서 지정된 문자 위치 sum에 값을 추가합니다 .xi

0 + 1 = 1
1 + 2 = 3
3 + 3 = 6

따라서 최종 결과 sum는 6입니다.

관련 정보