Integer ASCII value to character in BASH using printf Integer ASCII value to character in BASH using printf bash bash

Integer ASCII value to character in BASH using printf


One line

printf "\x$(printf %x 65)"

Two lines

set $(printf %x 65)printf "\x$1"

Here is one if you do not mind using awk

awk 'BEGIN{printf "%c", 65}'


This works (with the value in octal):

$ printf '%b' '\101'A

even for (some: don't go over 7) sequences:

$ printf '%b' '\'{101..107}ABCDEFG

A general construct that allows (decimal) values in any range is:

$ printf '%b' $(printf '\\%03o' {65..122})ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

Or you could use the hex values of the characters:

$ printf '%b' $(printf '\\x%x' {65..122})ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

You also could get the character back with xxd (use hexadecimal values):

$ echo "41" | xxd -p -rA

That is, one action is the reverse of the other:

$ printf "%x" "'A" | xxd -p -rA

And also works with several hex values at once:

$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -rABCDEFGHIJ

or sequences (printf is used here to get hex values):

$ printf '%x' {65..90} | xxd -r -p ABCDEFGHIJKLMNOPQRSTUVWXYZ

Or even use awk:

$ echo 65 | awk '{printf("%c",$1)}'A

even for sequences:

$ seq 65 90 | awk '{printf("%c",$1)}'ABCDEFGHIJKLMNOPQRSTUVWXYZ


For your second question, it seems the leading-quote syntax (\'A) is specific to printf:

If the leading character is a single-quote or double-quote, the value shall be the numeric value in the underlying codeset of the character following the single-quote or double-quote.

From https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html