Создание диапазона чисел от 08 до 10 в bash не включает 0 перед однозначными числами

Создание диапазона чисел от 08 до 10 в bash не включает 0 перед однозначными числами

На моей локальной машине, где я запускаю CentOS 7.2, когда я делаю это:

for i in {8..12}; do echo ${i}; done

Я получил:

8
9
10

Но когда я делаю это:

for i in {08..10}; do echo ${i}; done

Я получил:

08
09
10

Но на сервере, к которому у меня есть доступ и на котором работает CentOS 5.6, выполнение обеих команд приводит к одному и тому же результату:

8
9
10

Почему нет нулей перед 8 и 9? Это из-за версии bash или просто конфигурации среды? Могу ли я изменить это на сеанс или навсегда, чтобы мой сервер ставил этот ноль перед числами меньше 10?

решение1

Вероятно, bashна вашем компьютере с CentOS 5.6 установлена ​​версия 3. Заполнение нулями целых чисел в фигурных скобках было введено в версии 4 bash.

Решением будет либо обновить вашу установку до bashболее новой версии, либо использовать альтернативный способ генерации целых чисел, заполненных нулями, например:

printf '%02d\n' {8..10}

В качестве альтернативы, что-то вроде

for i in 0{1..9} {10..20}; do
    echo "$i"
done

тоже будет работать.

решение2

Вместо использования bashможно использовать zshто, откуда взят этот синтаксис.

zshподдерживается {08..10}с 1995 года (представлен в версии 2.6-beta4), поэтому будет доступен в zshлюбой версии CentOS (первый выпуск CentOS в 2004 году).

На самом деле вы использовали zshсинтаксис в своем примере, как в bashвам нужно echo "${i}"вместо echo ${i}для того, чтобы расширение $iне подвергалось разбиению на слова (и поэтому зависело от $IFS).

решение3

альтернативно, вы можете использовать seqкоманду

$ seq -f "%02g" 8 10
08
09
10

Связанный контент