내 Bash 스크립트가이 프로젝트 오일러에 대한 올바른 답을 반환하지 않는 이유는 무엇입니까?

Egrodo

Bash를 사용하여 Project Euler 13 을 완료하려고합니다 . 아래는 내가 무엇이 잘못되었는지 알아낼 수없는 내 코드입니다.

#!/bin/bash                                                
sum=0                                                      
while read -r -d $'\r' line; do                            
    sum=$(echo $sum + $line | bc)                          
done <<< "$(curl -s http://pastebin.com/raw/uHZ0PZjm)"     
echo "${sum:0:10}"                                         
exit 

                             

두 가지 오류가 발생했습니다.

(standard_in) 1: syntax error

(standard_in) 1: illegal character: ^M

몇 가지 조사 끝에 EOF 터미네이터에 문제가있는 것처럼 보였습니다. 그런 다음 dos2unix를 실행했는데 더 이상 두 번째 오류가 발생하지 않지만 여전히 첫 번째 오류가 반복적으로 발생합니다. 데이터를 bc로 파이핑하는 방법에 문제가있는 것 같지만 무엇을 어떻게 고치는 지 전혀 모르겠습니다.

정답은 5537376230입니다. 도와 주실 수있는 모든 것에 감사드립니다!

시스템 정보는

GNU bash, 버전 4.3.11 (1)-릴리스 (x86_64-pc-linux-gnu)

Windows 10에서 cmder를 사용하고 있습니다.

Spiff

\ n (== 0x0a == LF == 줄 바꿈)을 read구분 기호 로 설정하고 싶습니다 \r(== 0x0d == CR == 캐리지 리턴). 또는 pastebin 파일 끝에 CR을 입력하십시오. pastebin 파일의 마지막 줄 끝에 줄 종결 자 시퀀스가 ​​누락 된 것 같습니다. 따라서 마지막 줄은 스크립트에 입력되지 않습니다.

$ curl -s http://pastebin.com/raw/uHZ0PZjm | hexdump -C | tail -n 8
...(snip)...
000013e0  35 30 39 35 31 36 0d 0a  32 30 38 34 39 36 30 33  |509516..20849603|
000013f0  39 38 30 31 33 34 30 30  31 37 32 33 39 33 30 36  |9801340017239306|
00001400  37 31 36 36 36 38 32 33  35 35 35 32 34 35 32 35  |7166682355524525|
00001410  32 38 30 34 36 30 39 37  32 32 0d 0a 35 33 35 30  |2804609722..5350|
00001420  33 35 33 34 32 32 36 34  37 32 35 32 34 32 35 30  |3534226472524250|
00001430  38 37 34 30 35 34 30 37  35 35 39 31 37 38 39 37  |8740540755917897|
00001440  38 31 32 36 34 33 33 30  33 33 31 36 39 30        |81264330331690|
0000144e

각 숫자 사이에는 0x0d0a (CR LF)가 있지만 마지막 숫자 뒤에는 없습니다.

$ while read -r -d $'\r' line; do echo $line; done <<< "$(curl -s http://pastebin.com/raw/uHZ0PZjm)" | tail -n 3
77158542502016545090413245809786882778948721859617
72107838435069186155435662884062257473692284509516
20849603980134001723930671666823555245252804609722

read명령을 통해 실행할 때 마지막 숫자 인 535 [...] 690이 누락되었습니다 . 그러나 구분 기호를 Unix 고유 LF (\ n) 줄 바꿈 문자로 전환하면 마지막 줄이 포함됩니다.

$ while read -r -d $'\n' line; do echo $line; done <<< "$(curl -s http://pastebin.com/raw/uHZ0PZjm)" | tail -n 3
72107838435069186155435662884062257473692284509516
20849603980134001723930671666823555245252804609722
53503534226472524250874054075591789781264330331690

추가 편집 : pastebin 파일의 CR을 처리하는 수정 사항입니다. readCRLF를 구분 기호로 사용 하라고 말하고 pastebin 파일 뒤에 CRLF를 추가하기 위해 추가 에코를 사용했습니다.

sum=0
while read -r -d $'\r\n' line; do
    sum=$(echo $sum + $line | bc)
done <<< $(curl -s http://pastebin.com/raw/uHZ0PZjm; echo -e "\r\n")
echo "${sum:0:10}"

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관