Próbuję uruchomić dwie sekwencje w tej samej pętli w mojej powłoce, jak poniżej:
#!/bin/bash
for i in (1..15) and (20..25) ;
do
echo $i
......
.....other process
done
jakiś pomysł, jak mogę to osiągnąć?
command-line
bash
sh
HISI
źródło
źródło
Odpowiedzi:
Potrzebujesz do tego tylko rozszerzenia nawiasów klamrowych
Możemy przekazać listę do
for
( ).for i in x y z; do stuff "$i"; done
Zatem nawiasy klamrowe
{
}
pobierają powłokę, aby rozwinąć sekwencje w listę. Musisz tylko umieścić między nimi spację, ponieważ powłoka dzieli na nich listy argumentów.źródło
echo
liczbtouch
pliki, mogą po prostu zrobićtouch {1..15}.txt {20..25}.txt
, nie ma potrzeby tutaj pętli. Ale oczywiście, jeśli jest to wiele akcji na tym samym numerze - OK, można użyć pętli.Alternatywnie możemy użyć
seq
( wydrukować sekwencję liczb ), oto dwa równoważne przykłady:Jeśli jest to skrypt, do powtarzalnych zadań możesz użyć funkcji:
źródło
Odpowiedzi Zanny i pa4080 są dobre i prawdopodobnie wybrałbym jedną z nich w większości przypadków. Być może jest to oczywiste, ale ze względu na kompletność powiem to i tak: Możesz załadować każdą wartość do tablicy, a następnie zapętlić ją. Na przykład:
źródło
Pętla bez pętli
Odpowiedź Zanny jest absolutnie poprawna i dobrze nadaje się do bash, ale możemy to poprawić jeszcze bardziej bez użycia pętli.
Zachowanie się
printf
jest takie, że jeśli liczbaARGUMENTS
jest większa niż formanty w formacie'FORMAT STRING'
, wówczasprintf
wszystkie zostaną podzieloneARGUMENTS
na równe części i będą ciągle dopasowywać je do ciągu formatu, aż skończy sięARGUMENTS
lista.Jeśli dążymy do przenośności, możemy
printf "%d\n" $(seq 1 15) $(seq 20 25)
zamiast tego wykorzystaćWeźmy to dalej i więcej zabawy. Powiedzmy, że chcemy wykonać akcję, a nie tylko drukować liczby. Możemy z łatwością zrobić pliki z tej sekwencji liczb
touch {1..15}.txt {20..25}.txt
. Co jeśli chcemy, aby wydarzyło się wiele rzeczy? Możemy również zrobić coś takiego:Lub jeśli chcemy, aby był to oldschoolowy styl:
Przenośna, ale pełna alternatywy
Jeśli chcemy stworzyć rozwiązanie skryptowe, które będzie działać z powłokami, które nie mają rozszerzenia nawiasów klamrowych (na czym to
{1..15} {20..25}
polega), możemy napisać prostą pętlę while:Oczywiście to rozwiązanie jest bardziej szczegółowe, niektóre rzeczy można skrócić, ale działa. Testowane z
ksh
,dash
,mksh
i, oczywiściebash
.Pętla Bash w stylu C.
Ale jeśli chcielibyśmy stworzyć pętlę specyficzną dla bash (z jakiegokolwiek powodu, być może nie tylko drukowania, ale także robienia czegoś z tymi liczbami), możemy również to zrobić (w zasadzie wersja przenośnego rozwiązania z pętlą C):
Lub w bardziej czytelnym formacie:
Porównanie wydajności różnych metod zapętlania
Alternatywa bez powłoki
Tylko dlatego, że możemy tutaj znaleźć rozwiązanie Python
Lub z odrobiną powłoki:
źródło
touch $(printf "%d\n" {1..15} {20..25})
:-)bash
ciebie nawet$()
tam nie potrzebujesz , po prostutouch {1..15}.txt {20..25}.txt
:) Ale oczywiście moglibyśmy użyćprintf "%d\n
{1..15} {20..25} `zxargs
, gdybyśmy chcieli zrobić coś więcej niż tylkotouch
pliki. Jest wiele sposobów na robienie rzeczy, dzięki czemu pisanie skryptów sprawia tyle radości!