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