echo {A..z} 中的特殊字符代表什么

echo {A..z} 中的特殊字符代表什么

我知道我们可以使用命令打印字母表中的字母序列echo,并通过这样做进行了一些实验。

小写字母序列

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

大写字母序列

$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

大写和小写字母序列

$ echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [  ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z

现在这是我不明白的部分。请参阅special charcaters从 Z 到 a。这里有更好的景色。

$ echo {a..Z}
a ` _ ^ ]  [ Z

我想知道

  1. 这些特殊字符是如何出现在大写字母和小写字母之间的?

  2. 这些特殊字符序列意味着什么?

  3. 另外,我如何只打印中间的这个序列?

答案1

{A..z}根据当前区域设置的字符编码进行扩展,最有可能是 ASCII 或接近它的编码。如果您运行man ascii(如果您的系统上有这个)或查看ASCII 表Z您会在和之间看到这些附加字符a(与实际运行时得到的相同echo {Z..a})。

要仅获取大写/小写字符,请使用

echo {A..Z} {a..z}

为了得到中间的那些,你可以使用

typeset -a foo=($(echo {Z..a}))
echo ${foo[@]:1:((${#foo[@]} - 2))}

首先创建一个数组包括边界外的两个字符,然后访问所有数组元素除了边界字符。

PS:弄清楚为什么typeset -a foo=({Z..a})不起作用留给读者作为练习:-)

相关内容