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\x35is5なので、この場合はエスケープシーケンスを使用する必要はありません。

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

関連情報