价值的作用:
$ printf "%d\n" \'A
65
$
我有两个问题,第一个是最重要的:
答案 0 :(得分:55)
一行
printf "\x$(printf %x 65)"
两行
set $(printf %x 65)
printf "\x$1"
如果您不介意使用awk
awk 'BEGIN{printf "%c", 65}'
答案 1 :(得分:22)
这可行(使用八进制值):
$ printf '%b' '\101'
A
甚至(某些:不要超过7)序列:
$ printf '%b' '\'{101..107}
ABCDEFG
允许(十进制)任何范围内的值的一般结构是:
$ printf '%b' $(printf '\\%03o' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
或者您可以使用字符的十六进制值:
$ printf '%b' $(printf '\\x%x' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
您还可以使用xxd(使用十六进制值)获取字符:
$ echo "41" | xxd -p -r
A
也就是说,一个动作与另一个动作相反:
$ printf "%x" "'A" | xxd -p -r
A
同时也可以使用几个十六进制值:
$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r
ABCDEFGHIJ
或序列(此处使用printf获取十六进制值):
$ printf '%x' {65..90} | xxd -r -p
ABCDEFGHIJKLMNOPQRSTUVWXYZ
甚至使用awk:
$ echo 65 | awk '{printf("%c",$1)}'
A
即使是序列:
$ seq 65 90 | awk '{printf("%c",$1)}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ
答案 2 :(得分:9)
对于这种转换,我使用perl:
perl -e 'printf "%c\n", 65;'
答案 3 :(得分:8)
一种选择是使用十六进制或八进制表示法直接输入您感兴趣的字符:
printf "\x41\n"
printf "\101\n"
答案 4 :(得分:8)
对于您的第二个问题,似乎引用引用语法(\'A
)特定于printf
:
如果前导字符是单引号或双引号,则该值应为单引号或双引号后字符的基础代码集中的数值。
来自http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
答案 5 :(得分:7)
如果要保存字符的ASCII值: (我在BASH做过这个并且有效)
{
char="A"
testing=$( printf "%d" "'${char}" )
echo $testing}
输出: 65
答案 6 :(得分:4)
如果您将65
转换为十六进制,那么0x41
:
$ echo -e "\x41"
A
答案 7 :(得分:3)
这是将65转换为A(通过八进制)的另一种方法:
help printf # in Bash
man bash | less -Ip '^[[:blank:]]*printf'
printf "%d\n" '"A'
printf "%d\n" "'A"
printf '%b\n' "$(printf '\%03o' 65)"
在man bash
中搜索\'
使用(虽然在这种情况下徒劳无功):
man bash | less -Ip "\\\'" # press <n> to go through the matches
答案 8 :(得分:1)
这会打印基本bash设置中的所有“可打印”字符:
printf '%b\n' $(printf '\\%03o' {30..127})
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
答案 9 :(得分:0)
大写字母:
i=67
letters=({A..Z})
echo "${letters[$i-65]}"
输出:
C
答案 10 :(得分:0)
这里是没有 eval 或 $()或``:
ord () {
local s
printf -v s '\\%03o' $1
printf "$s"
}
ord 65
答案 11 :(得分:0)
以下脚本打印 aaa...zzz
(即 aaa > aab > aac > ... > zzx > zzy > zzz
)
for i in $(seq 0 25); do FIRST=$(printf \\$(printf '%03o' $[97+$i]) | tr -d '\n'); for f in $(seq 0 25); do SECOND=$(printf \\$(printf '%03o' $[97+$f]) | tr -d '\n'); for g in $(seq 0 25); do THIRD=$(printf \\$(printf '%03o' $[97+$g]) | tr -d '\n'); echo "${FIRST}${SECOND}${THIRD}"; done; done; done