Почему у моего алфавита было 40 писем? Или почему отказ от STDERR не всегда является хорошей идеей

От 0 до 40, есть 40 шагов?... для печати от A до Z

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 до 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

Я хотел бы получить полный ответ, объяснив 𝒂𝒍𝒍 14 (59) нежелательные шаги.

: - р

Полный ответ

Поскольку этот вопрос был закрыт, ответа не было добавлено, поэтому есть my пояснение:

Недостатки выполняются с помощью 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>&1 >/dev/null |
    wc -l
27

На самом деле существует 27 ошибок, о числах от 58 до 108...

echo $((070)) $((0155))
56 109

Хорошо, он восьмеричный.

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

И это делает 53 шага, а не 85!

echo $((53-27))
26

Да!

Это правильное количество букв (в моем алфавите)!

Заключение

Вопрос можно переписать как:

Как злоупотребление /dev/null может вызвать странное поведение

... В надежде, это может помочь кому-то.

Ответ 1

Вы просто используете octal числа, так как ваши цифры имеют префикс 0.

Итак, это база 8, а не база 10.

Ответ 2

У вас есть 31 шаг, потому что 040 octal для десятичного числа 32.

Octal - это система цифр с базой 8. Десятичная имеет базу 10 и шестнадцатеричную 16.

Ответ 3

Почему вы не используете следующее для печати алфавита?

for letter in {A..Z} ; do
    echo $letter
done