printf와 이스케이프 시퀀스를 사용하시나요?

printf와 이스케이프 시퀀스를 사용하시나요?

커서 모양을 다음과 같이 변경할 수 있습니다.

printf "\x1b[\x31 q" # block :)
printf "\x1b[\x35 q" # ibeam :)

하지만 변수에 할당 %s하고 확장을 사용 하면 printf작동하지 않습니다.

CURSOR="\x1b[\x3%s q"

printf ${CURSOR} 1 # block :(
printf ${CURSOR} 5 # ibeam :(

어떻게 해결할 수 있나요?

답변1

\x31는 문자 1이고 \x35is 5이므로 이 경우 이스케이프 시퀀스를 사용할 필요가 없습니다.

CURSOR="\x1b[%s q"

printf "${CURSOR}" 1
printf "${CURSOR}" 5

답변2

를 사용하면 \x3%sonly는 \x3이스케이프 시퀀스로 해석되며 %s더 이상 그 일부가 아닙니다. 해당 부분을 매개변수로 사용하려면 %b전체 부분을 사용하고 제거하여 \x31이스케이프 시퀀스로 해석해야 합니다.

$ printf "\x1b[\x31 q" | od -c
0000000 033   [   1       q
0000005
$ printf "\x1b[%b q" "\x31" | od -c
0000000 033   [   1       q
0000005

관련 정보