Bash 읽기: 쉼표로 구분된 목록을 읽는 중, 마지막 요소가 누락되었습니다.

Bash 읽기: 쉼표로 구분된 목록을 읽는 중, 마지막 요소가 누락되었습니다.

아래 명령의 출력이 이상해 보입니다. 왜 요소 5를 반환하지 않습니까?

$ echo '0,1,2,3,4,5' | while read -d, i; do echo $i; done
0
1
2
3
4

"5"도 반환될 것으로 예상됩니다. 달리기 GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu). 쉼표를 추가하면 작동하지만 입력 데이터에 쉼표가 없습니다. 내가 뭐 놓친 거 없니?

답변1

와 함께 read, -d다음을 위해 사용됨종료입력 라인(즉, 입력 라인을 분리하지 마십시오). 마지막 "라인"에는 종결자가 포함되어 있지 않으므로 readEOF에서 false가 반환되고 루프가 종료됩니다(최종 값을 읽더라도).

echo '0,1,2,3,4,5' | { while read -d, i; do echo "$i"; done; echo "last value=$i"; }

(사용하더라도 다른 방법 -dread사용하여 나타나는 $IFS후행 최종 값을 포함하여 공백을 흡수합니다. 예)\nreadarray

Bash FAQ에서는 이 문제와 다양한 유사한 상황을 처리하는 방법에 대해 설명합니다.

답변2

다른 답변에서 언급했듯이 -d필드 구분 기호가 아닌 줄 끝 문자입니다. 넌 할 수있어

IFS=, read -a fields <<< "1,2,3,4,5"
for i in "${fields[@]}"; do echo "$i"; done

답변3

남성의 경우:

-d 구분

delim의 첫 번째 문자는 개행 문자가 아닌 입력 줄을 종료하는 데 사용됩니다.

요소 5에는 구분 기호(쉼표)가 없으므로 읽을 수 없습니다.

답변4

당신이 보고 있는 행동은 다음과 일치합니다.이 "while" 루프가 마지막 줄을 인식하지 못하는 이유는 무엇입니까?

이 경우 다음과 같이 루프 종료 조건에 추가 테스트를 추가하여 동작을 수정할 수 있습니다.

while read -d, i || [[ -n $i ]]; do ...

전임자.

$ echo '0,1,2,3,4,5' | while read -d, i || [[ -n $i ]]; do echo $i; done
0
1
2
3
4
5

관련 정보