십진수를 ASCII 문자로 인쇄합니다. 내 명령이 예상대로 출력되지 않습니다.

십진수를 ASCII 문자로 인쇄합니다. 내 명령이 예상대로 출력되지 않습니다.

다음 명령을 사용하여 모든 ASCII 문자의 문자열을 출력하고 싶습니다

for i in `seq 32 127`; do printf "%c" $i; done

위 명령의 출력은 다음과 같습니다.

33333334444444444555555555566666666667777777777..............

각 숫자의 첫 번째(왼쪽부터) 숫자입니다.

이 사이트를 탐색하면서 내 질문에 대한 답변을 찾았습니다.CLI에서 인쇄 가능한 모든 ASCII 문자를 어떻게 인쇄합니까?, 하지만 원래 코드 조각이 예상대로 ASCII 문자를 출력하지 않는 이유를 여전히 이해할 수 없습니다.

답변1

printf "%c" $iC에서 유사한 방법을 사용하여 ASCII 코드를 직접 인쇄 할 수 없습니다 .

당신이 먼저해야i의 10진수 값을 8진수 값으로 변환그런 다음 using을 사용하여 인쇄 하고 해당 8진수 값 앞에 printf추가해야 합니다 .\

를 인쇄하려면 A10진수 65를 8진수(101)로 변환한 다음 해당 8진수 값을 다음과 같이 인쇄해야 합니다.

printf "\101\n"

그러면 인쇄됩니다 A.

따라서 다음과 같이 수정해야 합니다.

for i in `seq 32 127`; do printf \\$(printf "%o" $i);done;

하지만 다음을 사용하면 awkC 언어처럼 직접 인쇄할 수 있습니다.

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo

답변2

%c 연관된 매개변수를 char로 해석: 주어진 매개변수의 첫 번째 문자만 인쇄

이미 인쇄할 수 있는 방법이 있는 것 같지만 이는 변형된 것입니다.

for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done

답변3

필요 printf하지만 한 번만 다음 용도 중 하나를 printf더 간단하고 효율적인 Bash 이스케이프 시퀀스로 바꿀 수 있습니다.echo

16진수의 경우:

for i in `seq 32 127`; do
  echo -ne \\x$(printf %02x $i)
done

8진수의 경우:

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done

답변4

printf나처럼 형식 문자열을 가능한 한 변경하지 않으 려면 다음을 변경하십시오.

for i in `seq 32 127`; do printf "\\$(printf %o "$i")"; done
for i in `seq 32 127`; do printf "\x$(printf %x "$i")"; done  # not POSIX

도착하다

for i in `seq 32 127`; do printf %b "\0$(printf %o "$i")"; done
for i in `seq 32 127`; do printf %b "\x$(printf %x "$i")"; done  # not POSIX

(그런데,POSIX 표준printf\x형식 문자열에 허용되는 이스케이프 시퀀스 는 포함되지 않습니다 . )

우려 사항이 분리되어 있기 때문에 printf형식 문자열을 가능한 한 일정하게 유지하는 것을 선호합니다. 형식 문자열은 데이터 변경에 적용되는 형식 지정과 관련이 있습니다. 설명한 대로 형식 문자열의 확장자에 형식 지정자로 해석될 수 있는 내용이 포함되어 있는 경우에도 문제가 발생할 수 있습니다.여기C 프로그래밍 환경에서. 여기서도 논의됨: ShellCheck 린팅 규칙SC2059 printf 형식 문자열에 변수를 사용하지 마세요..

관련 정보