22

Я изучаю сценарии оболочки из устаревшего учебника, и мне кажется, что было бы очень полезно иметь программу, которая просто возвращает строку чисел, разделенных пробелами, что-то вроде

$ range 10 20
10 11 12 13 14 15 16 17 18 19 20

Затем, если вы делаете сценарий оболочки, вы можете иметь

for i in `range 10 20`; do some stuff with numbers in that range;done

такая вещь существует, или мне нужно написать это самому?

7 ответов7

79

seq является частью coreutils.

for i in $( seq 1 2 11 ) ; do echo $i ; done

Выход:

1
3
5
7
9
11

Если вы предоставляете только 2 аргумента для seq , приращение составляет 1:

$ seq 4 9
4
5
6
7
8
9
33

Достаточно ли Баша?

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

С расширением скобок можно многое сделать. Bash 4 также поддерживает дополняемые диапазоны, например, {01..20}

Обратите внимание, что Bash не считается переносимым и не является стандартной утилитой Unix. Хотя вы можете с уверенностью предположить, что он установлен в большинстве современных Linux, не используйте его в сценарии, который планируется запустить на всех типах Unix-подобных машин.

9

Если вы хотите что-то строго переносимое (то есть это не зависит от конкретных расширений bash или команд, не указанных в POSIX)

awk 'BEGIN {for(i=10;i<=20;i++) printf "%d ",i; print}'
6

До 10.7 не было seq на Mac OS X, но jot, в связи с BSD наследия.

jot -- print sequential or random data

...

HISTORY
    The jot utility first appeared in 4.2BSD

Пример:

$ jot - 1 3
1
2
3
2

Вы можете использовать seq , или, если у вас его нет, вы можете написать это самостоятельно:

#!/bin/bash
[ $# -ge 1 ] || { echo "Usage: seq Number [ Number ]" 1>&2 ; exit 1; }
[ $# -eq 1 ] && { [ $1 -gt 1 ] && ./seq $(($1 - 1)) ; echo $1 ; }
[ $# -eq 2 ] && { [ $(($2 - $1)) -gt 0 ] && ./seq $1 $(($2 - 1)) ; echo $2 ; }

Использование:

$ ./seq 3
1
2
3

Или же:

$ ./seq 3 7
3
4
5
6
7
2

Используйте for цикла

for ((i = 10; i <= 20; ++i)); do
    printf '%d\n' "$i"
done
1

Ради полноты здесь кое-что, что будет работать с некоторыми более старыми вариантами Unix (если на них установлен Perl). Не очень элегантно.

for I in $(perl -e 'print join("\n", 1..10)'); do something with $I; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .