Bash for loop z zakresem {# .. #}

17

{# .. #} generuje ciąg liczb lub znaków, podobnie jak range () w Pythonie. Jeśli wykonam polecenie echo {1..5}w wierszu polecenia, mam:

1 2 3 4 5

Zamiast tego poniższy skrypt bash nie działa zgodnie z oczekiwaniami.

for i in {1..3};
do
    echo "Iteration $i"
done

wydrukuje:

Iteration {1..3}

Dlaczego?
* Mogę użyć, seqale przeczytałem, że jest nieaktualny ( http://www.cyberciti.biz/faq/bash-for-loop/ )

Wstrząsnąć 0
źródło
Ten błąd występuje, jeśli skrypt jest wykonywany za pomocą polecenia „sh” (spróbuj użyć „bash”).
Shake0

Odpowiedzi:

22

Wypróbowałem Twój kod (skopiuj wklej do terminala) i uzyskał inny wynik niż ten, który opublikowałeś:

for i in {1..3};
do
    echo "Iteration $i"
done
#---OUTPUT BELOW---
Iteration 1
Iteration 2
Iteration 3

Używam Linux Mint 12 Lisa (pochodzący z Ubuntu) z wersją bash 4.2.10 (1)

zipizap
źródło
2
Masz rację! Myślałem, że sh i bash są tym samym…
Shake0
1
nie, bash i sh są zupełnie inne ... bash jest bardziej zdolny niż sh, został zrobiony na ramionach sh :) chociaż oba mają dobry stopień kompatybilności, mają też swoje różnice
zipizap
zwróć uwagę, że możesz tworzyć zagnieżdżone listy, takie jak dla var w {{i..j}, {l..m}}; wykonaj echo $ var; zrobione, jeśli potrzebujesz nieregularnej sekwencji, takiej jak 1 2 3 7 8 9
brązowy.2179
Zauważ, że w niektórych dystrybucjach /bin/shIS faktycznie wskazuje na bash, w Debianie i Ubuntu zazwyczaj wskazuje, /bin/dashktóra jest w większości zgodna z POSIX, ale nie obsługuje tej samej składni co Bash.
dragon788