Zaryzykuję przypuszczenie, że głos negatywny był spowodowany tym, że twoja odpowiedź była ogólna na „sh”, a nie specyficzna dla „bash”. Czyste podejście Bash {begin end step} działa tylko trochę lepiej. Starsza metoda 'seq' jest przydatna na starszych lub mniejszych systemach pamięci, takich jak busybox. Głosowałem za odpowiedzią zarówno twoją, jak i TheBonsai. :)
Scott Prive
6
Wolę $ (...) zamiast cudzysłowów. Cytaty wsteczne nie zagnieżdżają się normalnie.
Omnifarious
seq 1000000 1000010 robi tylko zmiennoprzecinkowe, właściwie - nie ma sposobu, aby zrobić liczby całkowite! Rozbudowa nawiasów działa.
hmijail opłakuje resignees
112
Rozszerzenie nawiasów klamrowych Bash 4 ma funkcję krokową:
for{0..10..2};do..done
Bez względu na to, czy Bash 2/3 (pętla w stylu C, patrz odpowiedzi powyżej) czy Bash 4, wolałbym cokolwiek zamiast polecenia „seq”.
i przy okazji, czy wiesz, czy bash4 jest domyślny w jakimkolwiek głównym systemie operacyjnym?
SilentGhost
3
Bash4 nadal nie jest głównym nurtem, nie. Dlaczego nie seq? Cóż, powiedzmy to słowami bota na kanale IRC #bash: „seq (1) to wysoce niestandardowe polecenie zewnętrzne używane do liczenia do 10 w głupich linuksowych instrukcjach”.
TheBonsai
rozumiem, że seq jest częścią coreutils. co w tym niestandardowego? argumenty? dzięki za pomoc.
SilentGhost
4
Te argumenty mogą, ale nie muszą się dla ciebie liczyć: * jest wystarczająco dużo systemów bez jądra GNU (ale zainstalowany Bash) * tworzysz niepotrzebny proces zewnętrzny * polegasz na założeniu, że wszystkie 'seq' robią to, co robi 'seq' * to jest nie znormalizowany przez ISO
TheBonsai
3
@becko Jeśli krok jest przechowywany w zmiennej i, nie możesz tego zrobić for {0..10..${i}}... kończy się niepowodzeniem.
Myślę, że to jest to, czego większość ludzi prawdopodobnie chce - prosty sposób na wykonanie pętli z określoną wartością kroku. Brzmi prościej niż wszystkie odpowiedzi oparte na sekwencjach i jest jaśniejszą składnią niż rozwinięcie nawiasów klamrowych Bash4 i wygląda na to, że dopuszcza zmienne (nie próbowałem tego, ale składnia zdecydowanie to sugeruje).
tobylaroni
Działa w Bash 3, w przeciwieństwie do odpowiedzi @ TheBonsai.
srcerer
Rozwiązuje nawet zmienną (((i = "$ first"; i <= "$ last"; i + = "$ step")). Nie tak łatwo z klamrami kręconymi i sekwencją.
Blaa_Thor
20
#!/bin/bashfor i in $(seq 1210)do
echo "skip by 2 value $i"done
Odpowiedzi:
mogłabym zrobić
(choć oczywiście
seq 0 2 10
sam wyprodukuje ten sam wynik).Zauważ, że
seq
dopuszcza liczby zmiennoprzecinkowe (np.seq .5 .25 3.5
), Ale rozwinięcie nawiasów klamrowych basha dopuszcza tylko liczby całkowite.źródło
Rozszerzenie nawiasów klamrowych Bash 4 ma funkcję krokową:
Bez względu na to, czy Bash 2/3 (pętla w stylu C, patrz odpowiedzi powyżej) czy Bash 4, wolałbym cokolwiek zamiast polecenia „seq”.
źródło
i
, nie możesz tego zrobićfor {0..10..${i}}
... kończy się niepowodzeniem.Pure Bash, bez dodatkowego procesu:
źródło
źródło
źródło