使用 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并且\x355,所以在这种情况下您不必使用转义序列。

CURSOR="\x1b[%s q"

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

答案2

通过使用\x3%s, only\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

相关内容