1

for ((i=000;i<040;i++));do ...

从 0 到 39,有 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

奇怪的!?

85 个值,从 70 到 154:

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

想要完整的答案,解释缺失值。

:-p

我的完整答案

由于此问题已关闭,因此无法添加任何答案,因此我的解释是:

误解是由(ab)使用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

事情变得更清楚了!

for ((i=0070;i<0155;i++));do
    echo -e $(eval "printf "\\\\%04o" $((19+0$i)) ")
  done 2> >(wc -l >&2) | xargs 
27
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

实际上有 27 个错误,值从... 56 到 108:

printf "%d\n" 0070 0155
56
109

好的,它是octal,所以不是 85 个值,而是 53 个:

echo $(( 155 - 70 ))  $(( 0155 - 0070 ))  $(( 109 - 56 ))
85 53 53

这会产生 53 个值和 27 个错误:

echo $((53-27))
26

是的!

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

结论

问题可以改写为:

滥用/dev/null如何产生奇怪的行为

所以在重定向 STDERR 时要小心,更喜欢使用如下命令:

command 2> >(grep -v "unwanted message" >&2)
4

3 回答 3

6

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

八进制是以 8 为底的数字系统。十进制以 10 为底,十六进制为 16。

于 2013-01-20T10:10:56.270 回答
5

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

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

于 2013-01-20T10:09:42.860 回答
1

你为什么不直接用下面的来打印字母表呢?

for letter in {A..Z} ; do
    echo $letter
done  
于 2013-01-20T10:10:29.760 回答