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


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самом деле работает?

Ответы:


16

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

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

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

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

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

2
Окончательный сценарий неверен, так как @ dr01 указал, вам нужно удалить точку с запятой после do.
Джейк

1
@ Джейк, это также говорит, что вы должны удалить точку с запятой после do. Кроме того, этот ответ объясняет, почему вы должны удалить точку с запятой после `do '.
user4556274

Что делать, если оно $iдолжно быть частью имени файла? Нужны ли двойные кавычки?
Аноним

18

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

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

for i in `seq 1 10`; do echo $i; done 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.