Bash范围的非数字或字母

时间:2017-12-09 00:24:57

标签: bash

我今天玩了bash {..}构造。我知道

{a..z}

会生成所有字母,

{0..9}

数字等(一般数字显然),但错误地我得到了

{Z..a}

得到以下特性:

Z [  ] ^ _ ` a

“Z”(90)和“a”(97)之间的字符是ASCII 91-96。精明的读者会注意到有一个角色缺失 - “\”,92。我猜是因为它的特殊性。此预期行为是否为输出?具体来说,我猜测\在替换后被用来逃避它前面的空间,但@ John1024注意到:

echo {Z..a}a

会抱怨缺少反引号,而之前的版本(没有a)却没有。 替代是如何运作的?有错误吗?

其次,我猜测范围运算符比我想象的要冷,并且可以选择任何范围的ASCII字符,但{[.._}例如失败。我错过了一些能让这项工作成功的事情,还是只是好奇心? 除了我可以使用的字母/数字之外还有其他范围吗?如果没有,为什么不做什么(失败,回声)从'上限'跳到下限?

2 个答案:

答案 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