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