有几种特定于 shell 的方法可以在字符串中包含“unicode 文字”。例如,在 Bash 中,带引号的字符串扩展机制$''
允许我们直接嵌入一个不可见字符:$'\u2620'
.
但是,如果您尝试编写通用的跨平台 shell 脚本(通常,这可以被截断为“在 Bash、Zsh 和 Dash 中运行”),这不是一个可移植的特性。
我可以使用如下构造可移植地实现 ASCII 表(八进制数空间)中的任何内容:
WHAT_A_CHARACTER="$(printf '\036')"
…但是,POSIX / Dashprintf
仅支持八进制转义。
显然,我还可以通过将任务转移到更完整的编程环境来实现完整的 Unicode 空间:
OH_CAPTAIN_MY_CAPTAIN="$(ruby -e 'print "\u2388"')"
TAKE_ME_OUT_TONIGHT="$(node -e 'console.log("\u266C")')"
那么:将这样的字符编码为shell脚本的最佳方法是什么,即:
- 适用于
dash
,bash
和zsh
, - 显示代码中代码点的十六进制编码,
- 不依赖于字符串的特定编码(即不通过以八进制编码 UTF-8 字节)
- 最后,不需要调用任何“重”解释器。(比方说,少于 0.01 秒的运行时间。)