Як зробити цикл for в командному рядку?


22

Візьмемо просте for loop

#!/bin/bash

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

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

Так чому оболонка не може інтерпретувати наступний рядок

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
@jake, це також говорить про те, що ви повинні видалити крапку з комою після do. Крім того, ця відповідь пояснює, чому ви повинні видалити крапку з комою після "робити".
користувач4556274

Що робити, якщо $iпотрібно бути частиною імені файлу? Чи потрібні подвійні лапки?
Анонім

18

Точка з комою після doпомилки - помилка, і її не повинно бути.

Наступне працює правильно:

for i in `seq 1 10`; do echo $i; done 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.