给定一些 ASCII 数字,使用 `printf` 输出字符

pat*_*lan 8 bash printf

我一直在尝试printf输出一些字符,给定它们的 ASCII 数字(十六进制)......像这样:

#!/bin/bash

hexchars () { printf '\x%s' $@ ;}

hexchars 48 65 6c 6c 6f

Expected output:
Hello
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这不起作用。有任何想法吗?

编辑:

根据 Isaac 提供的答案(接受的答案),我最终得到了这个函数:

chr  () { local var ; printf -v var '\\x%x' $@ ; printf "$var" ;}
Run Code Online (Sandbox Code Playgroud)

请注意,为了通过避免使用子shell来提高速度,我稍微改写了他的答案。

Result:

~# chr 0x48 0x65 0x6c 0x6c 0x6f
Hello
~# chr 72 101 108 108 111
Hello
~# chr {32..126}
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
Run Code Online (Sandbox Code Playgroud)

我猜这个chr函数的反函数应该是一个像...

asc () { printf '%d\n' "'$1"  ;}
asc A
65
chr 65
A
Run Code Online (Sandbox Code Playgroud)

或者,如果我们想要严格的十六进制变体......

chrx () { local var ; printf -v var '\\x%s' $@ ; printf "$var\n" ;}
ascx () { printf '%x\n' "'$1"  ;}

chrx 48 65 6c 6c 6f
Hello
ascx A
41
Run Code Online (Sandbox Code Playgroud)

谢谢!

ImH*_*ere 6

哦,当然,只是它必须分两步完成。就像两步探戈:

$ printf "$(printf  '\\x%s' 48 65 6c 6c 6f)"; echo
Hello
Run Code Online (Sandbox Code Playgroud)

或者,或者:

$ test () { printf "$(printf  '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
Run Code Online (Sandbox Code Playgroud)

或者,为了避免打印“无参数”:

$ test () { [ "$#" -gt 0 ] && printf "$(printf  '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
$ 
Run Code Online (Sandbox Code Playgroud)

那是假设参数是 1 到 127 之间的十进制值(空参数会被计算在内,但在打印时会失败)。