我今天玩了bash {..}
构造。我知道
{a..z}
会生成所有字母,
{0..9}
数字等(一般数字显然),但错误地我得到了
{Z..a}
得到以下特性:
Z [ ] ^ _ ` a
“Z”(90)和“a”(97)之间的字符是ASCII 91-96。精明的读者会注意到有一个角色缺失 - “\”,92。我猜是因为它的特殊性。此预期行为是否为输出?具体来说,我猜测\
在替换后被用来逃避它前面的空间,但@ John1024注意到:
echo {Z..a}a
会抱怨缺少反引号,而之前的版本(没有a
)却没有。 替代是如何运作的?有错误吗?
其次,我猜测范围运算符比我想象的要冷,并且可以选择任何范围的ASCII字符,但{[.._}
例如失败。我错过了一些能让这项工作成功的事情,还是只是好奇心? 除了我可以使用的字母/数字之外还有其他范围吗?如果没有,为什么不做什么(失败,回声)从'上限'跳到下限?
答案 0 :(得分:4)
正在生成\
;然而,它似乎被视为逃避以下空间。比较:
$ printf '%s\n' 'Z' '[' ']' '^' '_' '`' 'a'
Z
[
]
^
_
`
a
$ printf '%s\n' {Z..a}
Z
[
]
^
_
`
a
[
后面的额外空白行是由{Z..a}
生成的反斜杠转义的空格。
答案 1 :(得分:1)
特殊变量obase
可与bc
一起使用,以打印几乎所有字符范围:
for n in {91..95}; do printf "\x$(echo "obase=16; $n" | bc)"; done
结果:
[\]^_
↳https://www.gnu.org/software/bc/manual/html_mono/bc.html#TOC6