为什么我的字母表有40个字母?或者为什么放弃STDERR并不总是一个好主意

F. *_*uri 0 bash

从0到40,有40步?...用于打印 AZ???

for ((i=000;i<040;i++));do
    echo -e $(eval "printf "\\\\%04o" $((65+0$i)) ");
  done 2>/dev/null |
  xargs

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
Run Code Online (Sandbox Code Playgroud)

奇怪!?

共有85个步骤,从70到155:

for ((i=0070;i<0155;i++));do
    echo -e $(eval "printf "\\\\%04o" $((19+0$i)) ");
  done 2>/dev/null |
    xargs
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
Run Code Online (Sandbox Code Playgroud)

我想要一个完整的答案,解释14(59)个不需要的步骤.

:-P

完整答案

由于这个问题已经结束,所以无法添加答案,所以有我的解释:

误解是通过使用2>/dev/null!! 来完成的!

所以,简单地删除它将会:

for ((i=0070;i<0155;i++));do
    echo -e $(eval "printf "\\\\%04o" $((19+0$i)) ");
  done |
    xargs
bash: 19+058: value too great for base (error token is "058")
bash: 19+059: value too great for base (error token is "059")
...
bash: 19+098: value too great for base (error token is "098")
bash: 19+099: value too great for base (error token is "099")
bash: 19+0108: value too great for base (error token is "0108")
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
Run Code Online (Sandbox Code Playgroud)

事情变得更加清晰!

for ((i=0070;i<0155;i++));do
    echo -e $(eval "printf "\\\\%04o" $((19+0$i)) ")
  done 2>&1 >/dev/null |
    wc -l
27
Run Code Online (Sandbox Code Playgroud)

事实上有27个错误,数字介于58和108之间......

echo $((070)) $((0155))
56 109
Run Code Online (Sandbox Code Playgroud)

好的,它是八进制的.

echo $(( 155 - 70 ))  $(( 0155 - 070 ))  $(( 109 - 56 ))
85 53 53
Run Code Online (Sandbox Code Playgroud)

这使得53步,而不是85步!

echo $((53-27))
26
Run Code Online (Sandbox Code Playgroud)

是!

这是正确的字母数(在我的字母表中)!

结论

这个问题可以改写为:

如何滥用/dev/null可能会造成奇怪的行为

...希望这可以帮助别人.

rek*_*ire 6

你有31步,因为040是十进制32的八进制.

Octal是一个带有基数为8的数字系统.十进制有十进制数16和十六进制数16.


Mac*_*ade 5

您仅使用八进制数字,因为您的数字以0为前缀。

所以它是8的基数,而不是10的基数。