将十进制打印为 ascii 字符,我的命令没有按预期输出

Ift*_*han 15 shell bash character-encoding ascii

我想使用以下命令输出所有 ascii 字符的字符串

for i in `seq 32 127`; do printf "%c" $i; done
Run Code Online (Sandbox Code Playgroud)

上面命令的输出是:

33333334444444444555555555566666666667777777777..............
Run Code Online (Sandbox Code Playgroud)

它是每个数字的第一个(从左边开始)数字。

浏览这个网站,我发现了我的问题的答案如何在 CLI 中打印所有可打印的 ASCII 字符?,但是我仍然不明白为什么我的原始代码段没有按预期输出 ascii 字符。

pra*_*tri 14

你不能printf "%c" $i在 C 中使用like直接打印 ascii 代码。

您必须首先将 i 的十进制值转换为其八进制值,然后您必须使用 usingprintf并将其放在\它们各自的八进制值前面来打印它。

要打印A,您必须将十进制 65 转换为八进制,即 101,然后您必须将该八进制值打印为:

printf "\101\n"
Run Code Online (Sandbox Code Playgroud)

这将打印A.

因此,您必须将其修改为:

for i in `seq 32 127`; do printf \\$(printf "%o" $i);done;
Run Code Online (Sandbox Code Playgroud)

但是通过使用awk你可以像C语言一样直接打印

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo
Run Code Online (Sandbox Code Playgroud)

  • 在 `bash` 和 `zsh` 中,这可以在没有循环和外部命令的情况下完成:`printf $(printf '\%o' {32..127})`。 (7认同)