Shell中无外部工具将空格分隔ASCII数字转字母的便捷方法
Shell 无外部工具将空格分隔ASCII数字转对应字符串的实现方法
所有实现均仅使用Shell内置能力,不调用任何外部第三方工具/系统外部命令,可直接在Shell交互环境运行。示例输入104 101 108 108 111经以下方法处理后均可输出hello。
方法1:POSIX 兼容通用写法(全主流Shell支持:dash/bash/zsh/ash等)
利用内置printf的转义解析能力,先将每个十进制ASCII码转为八进制转义序列,再直接解析输出:# 先把待转换的数字序列存入变量 ascii_seq="104 101 108 108 111" printf "\\$(printf '%03o' $ascii_seq)"内层
printf会遍历所有传入的数字参数,将每个十进制数转为3位长度的八进制字符串,外层printf识别带\前缀的八进制转义序列,直接输出对应字符,全程无外部进程调用。如果需要在输出末尾加换行,在最后补一个printf '\n'即可。方法2:十六进制转义写法(兼容绝大多数现代Shell)
原理和八进制写法类似,只是将数字转为十六进制后搭配\x前缀解析:ascii_seq="104 101 108 108 111" for n in $ascii_seq; do printf "\x$(printf '%x' "$n")"; done这个写法逻辑更直观,仅多一层循环,日常使用无性能差异。
方法3:Zsh 专属极简写法
如果使用Zsh作为交互Shell,可以直接利用Zsh的参数扩展和进制转换内置能力,不需要嵌套命令或循环:ascii_seq="104 101 108 108 111" print ${ascii_seq//(#m)[0-9]##/\\x${(l:2::0:)$(([##16]MATCH))}}
注意:直接输入
printf调用的是Shell内置版本,不要写绝对路径/usr/bin/printf,后者属于外部工具,不符合要求。
内容的提问来源于stack exchange,提问作者Isomane
相关产品推荐
相关产品推荐

