2013-11-20 3 views
2

Я все еще на Snow Leopard (я знаю ...), так что простите, если это зафиксировано в одном из более поздних версий OS/X, но я хочу сделать стандартный «Seq» иначе:Как в OS/X получить функциональность командной строки «seq»?

for i in `seq 1 100` ; do 
    cat /whatever > $i.txt ; 
done 

Я думал, что установка инструментов GNU сделает это, но, видимо, нет.

+0

Действительно ли 'for i in {1..100}' работает для вас? – fedorqui

+1

Возможно, вы можете использовать '$ (command)', а не синтаксис backtick, который мне слишком ленив, чтобы понять, как показать в комментарии. Это немного легче читать, и оно может быть вложенным. –

ответ

2

На мой макинтош обе эти работы (OS X 10.8.5)

Andreas-Wederbrands-MacBook-Pro:~ raven$ for i in {1..10}; do echo $i; done 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
Andreas-Wederbrands-MacBook-Pro:~ raven$ for i in `seq 1 10`; do echo $i; done 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
+0

Похоже, вы находитесь на более новой версии OS/X. Я получаю команду seq не найденной, однако работает {1..10}! Благодаря! –

+0

OS X 10.5 не имеет 'seq'. OS X 10.5 была последней версией PowerMac (PowerPC). Snow Leopard - OS X 10.6. Он был доступен для Intel. – jww

2

В Snow Leopard, вы можете использовать jot команду, которая может производить последовательные данные, как seq (и многое другое, увидеть человека страница).

$ jot 5 
1 
2 
3 
4 
5 
$ jot 3 5 
5 
6 
7 
+0

Является ли 'jot' стандартом? (Конечно, 'seq' тоже не является, но было бы неплохо указать людям на инструменты, которые будут доступны везде, где есть их оболочка). –

+0

Я не думаю, что есть стандартный ответ; расширение расширений и C-образные петли отсутствуют в POSIX. 'jot' приятно знать, так как это версия, эквивалентная« seq », доступная в OS X 10.6 (сам' seq' поставляется с 10.8+, может быть, 10.7). Во всяком случае, принятый ответ и ваш достаточно хорошо описывают «bash». – chepner

+0

I _do_ покройте опцию POSIX в нижней части моего ответа; это третий кодовый блок. –

2

Нет необходимости такого инструмента, как seq - Баш (как KSH и Zsh) имеет синтаксис встроенный:

# bash 3.x+ 
for ((i=0; i<100; i++)); do 
    ... 
done 

... или, Баш 2.04+, ЗШ, и ksh93:

i=0; while ((i++ <= 100)); do 
    ... 
done 

... или, для абсолютно любой POSIX-совместимой оболочки:

while [ $(((i += 1) <= 100)) -ne 0 ]; do 
    ... 
done 

bash также поддерживает расширения, такие как {0..100}, но это не поддерживает переменные как конечные точки, тогда как синтаксис for-loop более гибкий.

+0

'i = 20,0; while [$ ((i - = 0,1)> = 1,0)) -ne 0]; 'приводит к *** синтаксической ошибке: неверный арифметический оператор (маркер ошибки равен« .0 »)' ***. Bash is *** 'GNU bash, версия 3.2.17 (1) -release (powerpc-apple-darwin9.0)' ***. – jww

+0

@jww, конечно, это так; bash имеет только целую математику. Нет никакой гарантии, что 'seq' также предоставляет с плавающей точкой - на нескольких платформах это не так. –

+0

Но 'seq' позволяет нам это сделать:' for i in $ (seq -f "% .1f" 20.0 -0.1 1.0) '. – jww

0

Или, просто добавьте в свой профиль Баш:

function seq { 
    if [ $1 > $2 ] ; then 
    for ((i=$1; i<=$2; i++)) 
     do echo $i 
    done 
    else 
    for ((i=$1; i>=$2; i--)) 
     do echo $i 
    done 
    fi 
} 

Это не так уж трудно.

+1

Использование '[$ 1> $ 2]' здесь неверно - это на самом деле перенаправление (в файл с именем '$ 2')), а не математическое сравнение. Вместо этого используйте '(($ 1> $ 2))', поскольку вы уже принимаете синтаксис только для bash или '[" $ 1 "-gt" $ 2 "]' для чего-то более портативного. –

+1

... и говоря о синтаксисе только для bash, следует избегать ключевого слова 'function'. 'seq() {' является определяемым POSIX способом объявлять функции и, следовательно, лучше привыкнуть, если вам нужно написать переносимый код. –

Смежные вопросы