아래 명령의 출력이 이상해 보입니다. 왜 요소 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
다음을 위해 사용됨종료입력 라인(즉, 입력 라인을 분리하지 마십시오). 마지막 "라인"에는 종결자가 포함되어 있지 않으므로 read
EOF에서 false가 반환되고 루프가 종료됩니다(최종 값을 읽더라도).
echo '0,1,2,3,4,5' | { while read -d, i; do echo "$i"; done; echo "last value=$i"; }
(사용하더라도 다른 방법 -d
을 read
사용하여 나타나는 $IFS
후행 최종 값을 포함하여 공백을 흡수합니다. 예)\n
readarray
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