如何遍历Bash中的所有ASCII字符?

我知道如何遍历字母:

for c in {a..z}; do ...; done 

但我不知道如何遍历所有的ASCII字符。 有谁知道如何?

Solutions Collecting From Web of "如何遍历Bash中的所有ASCII字符?"

你可以做的是从0到127迭代,然后将十进制值转换为它的ASCII值(或返回)。

你可以使用这些函数来做到这一点:

 # POSIX # chr() - converts decimal value to its ASCII character representation # ord() - converts ASCII character to its decimal value chr() { [ ${1} -lt 256 ] || return 1 printf \\$(printf '%03o' $1) } # Another version doing the octal conversion with arithmetic # faster as it avoids a subshell chr () { [ ${1} -lt 256 ] || return 1 printf \\$(($1/64*100+$1%64/8*10+$1%8)) } # Another version using a temporary variable to avoid subshell. # This one requires bash 3.1. chr() { local tmp [ ${1} -lt 256 ] || return 1 printf -v tmp '%03o' "$1" printf \\"$tmp" } ord() { LC_CTYPE=C printf '%d' "'$1" } # hex() - converts ASCII character to a hexadecimal value # unhex() - converts a hexadecimal value to an ASCII character hex() { LC_CTYPE=C printf '%x' "'$1" } unhex() { printf \\x"$1" } # examples: chr $(ord A) # -> A ord $(chr 65) # -> 65 

仅使用echo s八进制转义序列的可能性:

 for n in {0..7}{0..7}{0..7}; do echo -ne "\\0$n"; done 

以下是如何用awk打印整数作为其对应的ASCII字符:

 echo "65" | awk '{ printf("%c", $0); }' 

这将打印:

 A 

这就是你如何通过这种方式遍历大写字母:

 # ascii for A starts at 65: ascii=65 index=1 total=26 while [[ $total -ge $index ]] do letter=$(echo "$ascii" | awk '{ printf("%c", $0); }') echo "The $index'th letter is $letter" # Increment the index counter as well as the ascii counter index=$((index+1)) ascii=$((ascii+1)) done 

那么……如果你真的想要所有的东西,而且你希望它成为脚本的东西,那么你可以这样做,我想:

 awk 'function utf32(i) {printf("%c%c%c%c",i%0x100,i/0x100%0x100,i/0x10000%0x100,i/0x1000000) } BEGIN{for(i=0;i<0x110000;i++){utf32(i);utf32(0xa)}}' | iconv --from-code=utf32 --to-code=utf8 | grep -a '[[:print:]]' 

但是这个列表非常庞大,并不是很有用。 Awk可能不是生成从0到0x110000的二进制整数的最优雅的方式 – 如果找到它,则替换更优雅的东西。

编辑:哦,我看你只想要ascii。 那么,我会让这个答案留在这里,以防其他人真的想要所有的UTF可打印字符。

下面是我提出的一个简单的问题,从sampson-chen和mata的答案中拿出一些内容:

 for n in {0..127}; do awk '{ printf("%c", $0); }' <<< $n; done 

或者:

 for n in {0..127}; do echo $n; done | awk '{ printf("%c", $0); }'