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

Weźmy prostą for loop

#!/bin/bash for i in `seq 1 10`; do echo $i done 

AFAIK średnik w skryptach bash sprawia, ż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 powłoka nie może „nie zinterpretować następującego wiersza

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

w jaki sposób to for loop w rzeczywistości działa?

Odpowiedź

Składnia for pętli z bash strona podręcznika to

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

Średniki można zastąpić znakami powrotu karetki, jak wskazano w innym miejscu w : „Na liście zamiast średnika może pojawić się sekwencja jednej lub więcej znaków nowej linii w celu oddzielenia poleceń.”

Jednak odwrotność nie jest prawdą; nie możesz arbitralnie zamień znaki nowej linii ze średnikami. Twój skrypt wielowierszowy można przekształcić w pojedynczą linię, o ile przestrzegasz powyższych reguł składniowych i nie wstawiaj dodatkowego średnika po do:

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

Komentarze

  • Ostateczny skrypt jest nieprawidłowy, jak wskazał @ dr01, należy usunąć średnik po do.
  • @jake, to również mówi, że musisz usunąć średnik po do. Ponadto ta odpowiedź wyjaśnia, dlaczego należy usunąć średnik po „do '.
  • Co jeśli $i musi być częścią nazwy pliku? Czy wymaga podwójnych cudzysłowów?
  • wykonaj filename_${i}, a następnie
  • @ user4556274 zgodnie ze składnią " dla ja do; gotowe " również powinno działać. dlaczego nie ' nie?

Odpowiedź

Średnik po do to błąd i nie powinno go tam być.

Poniższy kod działa poprawnie:

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *