Как сделать цикл для в командной строке?

22

Давайте возьмем простой for loop

#!/bin/bash

for i in `seq 1 10`;
do
    echo $i
done

Точка с запятой AFAIK в скриптах bash заставляет оболочку выполнять текущую команду синхронно и затем переходить к следующей. Нажатие клавиши ввода делает то же самое, за исключением того, что она не позволяет вам ввести следующую команду, немедленно очищая буфер.

Так почему оболочка не может интерпретировать следующую строку

for i in `seq 1 10`; do; echo $i; done

как это на for loopсамом деле работает?

user30167
источник

Ответы:

16

Синтаксис forцикла со bashстраницы руководства:

for name [ [ in [ word ... ] ] ; ] do list ; done

Точки с запятой можно заменить на возврат каретки, как отмечено в другом месте на bashстранице руководства: «В списке вместо последовательности с запятой может появляться последовательность из одной или нескольких строк новой строки».

Однако обратное неверно; Вы не можете произвольно заменить символы новой строки на точки с запятой. Ваш многострочный скрипт может быть преобразован в одну строку, если вы соблюдаете приведенные выше правила синтаксиса и не вставляете лишнюю точку с запятой после do:

for i in `seq 1 10`; do echo $i; done
user4556274
источник
2
Окончательный сценарий неверен, так как @ dr01 указал, вам нужно удалить точку с запятой после do.
Джейк
1
@ Джейк, это также говорит, что вы должны удалить точку с запятой после do. Кроме того, этот ответ объясняет, почему вы должны удалить точку с запятой после `do '.
user4556274
Что делать, если оно $iдолжно быть частью имени файла? Нужны ли двойные кавычки?
Аноним
18

Точка с запятой после doявляется ошибкой и не должна быть там.

Следующее работает правильно:

for i in `seq 1 10`; do echo $i; done 
dr01
источник