bash는 개행 문자를 읽고 printf는 문자 0을 보고합니다.

bash는 개행 문자를 읽고 printf는 문자 0을 보고합니다.

bash printf함수를 사용하여 입력 파일에 있는 문자의 ASCII 코드를 인쇄하지만 어떤 이유로 printf출력 LF문자에 10 대신 ASCII 코드 0이 표시됩니다. 어떤 아이디어가 있나요?

while IFS= read -r -n1 c
do
ch=$(LC_CTYPE=C printf "%d\n" "'$c") # convert to integer
echo "ch=$ch"
done < input_file_name

printf솔직히 말해서 이것이 문제인지, 아니면 함수가 잘못된 LF 값을 제공하는지 조차 잘 모르겠습니다 read... bash 명령을 사용하여 문자를 ASCII로 변환하는 다른 방법이 있습니까?

답변1

먼저 printf 기능이 완벽하게 작동합니다.

$ export c=" "
$ LC_CTYPE=C printf "%d\n" "'$c"
32

하지만 -vx를 사용하여 스크립트 줄을 실행하면 해당 줄에 도착하는 데이터가 잘못되었음을 알 수 있습니다(이 출력은 붙여넣지 않겠습니다).

그래서 나는 그것이 읽기 오류라고 생각합니다. 읽기용 기본 EOL 구분 기호는 개행 문자이므로 변경해 보았습니다. 이게 효과가 있는 것 같아요

while IFS= read -d\0 -r -n1 c; do ch=$(LC_CTYPE=C printf "%d\n" "'$c") ; echo "ch=$ch"; done < input_file_name

답변2

아무 문제 가 없지만 read결과에 대한 해석이 약간 잘못되었습니다.

EOL 플래그는 \n이므로 해당 문자를 입력하면 read문자가 없는 "줄"이 발생한다는 의미입니다. 이 변수에는 다음이 $c포함되지 않습니다 \n.

while IFS= read -r c
do
    test -z "$c" && echo "Zero length string" || echo "I read '$c'"
done

추가하면 -n1읽을 수 있는 문자 수를 하나로 제한할 수 있습니다. 위의 예와 같이 \n허용되는 문자열의 일부가 아니므로 read다음을 입력하면 "nothing"이 반환됩니다 \n.

while IFS= read -r -n1 c
do
    test -z "$c" && echo "Zero length string" || echo "I read '$c'"
done

printf명령은 흥미롭습니다. 작은 따옴표 앞에 길이가 0인 문자열을 입력하면 "0"도 얻게 되므로 여기서 대답은 "하지 마세요"인 것 같습니다.

LC_CTYPE=C printf "%d" "'" | od -c
0000000   0

관련 정보