Jak zrobić pętlę for w linii poleceń?


22

Weźmy prosty for loop

#!/bin/bash

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

Średnik AFAIK w skryptach bash powoduje, że powłoka wykonuje bieżące polecenie synchronicznie, a następnie przechodzi do następnego. Naciśnięcie klawisza Enter robi dosłownie to samo, z wyjątkiem tego, że nie pozwala na wprowadzenie następującego polecenia, natychmiast opróżniając bufor.

Dlaczego więc shell nie może zinterpretować następującego wiersza

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

jak to for loopwłaściwie działa?

Odpowiedzi:


16

Składnia forpętli ze strony bashpodręcznika to

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

Średniki można zastąpić znakami powrotu karetki, jak zauważono w innym miejscu strony bashpodręcznika: „Sekwencja jednego lub więcej znaków nowego wiersza może pojawiać się na liście zamiast średnika w celu rozgraniczenia poleceń”.

Jednak sytuacja odwrotna nie jest prawdą; nie można arbitralnie zastępować znaków nowej linii średnikami. Skrypt wielowierszowy można przekonwertować do pojedynczego wiersza, o ile przestrzega się powyższych reguł składni i nie wstawia dodatkowego średnika po do:

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

2
Ostatni skrypt jest nieprawidłowy, jak zauważył @ dr01, po tym trzeba usunąć średnik do.
Jake,

1
@ jake, oznacza to również, że musisz usunąć średnik po do. Ponadto ta odpowiedź wyjaśnia, dlaczego należy usunąć średnik po `do '.
user4556274

Co jeśli $imusi być częścią nazwy pliku? Czy potrzebuje podwójnych cudzysłowów?
Anonimowy

18

Średnik po dojest błędem i nie powinien tam być.

Następujące działa poprawnie:

for i in `seq 1 10`; do echo $i; done 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.