Załóżmy, że mam zmienną powłoki Unix, jak poniżej
variable=abc,def,ghij
I Aby wyodrębnić wszystkie wartości ( abc
, def
i ghij
) za pomocą pętli i przechodzi każdą wartość w procedurze.
Skrypt powinien umożliwiać wyodrębnienie dowolnej liczby wartości oddzielonych przecinkami z $variable
.
Odpowiedzi:
Możesz użyć następującego skryptu do dynamicznego przechodzenia przez zmienną, bez względu na to, ile ma pól, o ile jest oddzielona przecinkami.
Zamiast
echo "$i"
powyższego wywołania, pomiędzydo
idone
wewnątrz pętli for, możesz wywołać swoją proceduręproc "$i"
.Aktualizacja : powyższy fragment działa, jeśli wartość zmiennej nie zawiera spacji. Jeśli masz takie wymaganie, użyj jednego z rozwiązań, które mogą się zmienić,
IFS
a następnie przeanalizuj zmienną.Mam nadzieję że to pomoże.
źródło
$variable
zawiera białe znaki, np.variable=a b,c,d
=> Wyświetla 4 linie (a | b | c | d) zamiast 3 (ab | c | d)"value
**. czy mógłbyś zaktualizować, jeśli istnieje jakieś wyrażenie regularne, aby to usunąć ...Nie zadziera się z IFS
Nie wywołuje polecenia zewnętrznego
Korzystanie z manipulacji ciągami basha http://www.tldp.org/LDP/abs/html/string-manipulation.html
źródło
IFS
!$i
zawiera spacje, zostanie podzielona (i może to być powód, dla którego jest przekazywana jako oddzielona przecinkami, a nie spacjami)for i in ${variable//,/$IFS} do; echo "$i"; done
Jeśli ustawisz inny separator pól, możesz bezpośrednio użyć
for
pętli:Możesz również przechowywać wartości w tablicy, a następnie przeglądać je w pętli, jak wskazano w Jak podzielić ciąg na separatorze w Bash? :
Test
W tym rozwiązaniu można znaleźć szersze podejście do sposobu iteracji po liście oddzielonej przecinkami i wykonywania polecenia dla każdego wpisu .
Przykłady drugiego podejścia:
źródło
while
do wczytania do tablicy i kolejnego do zapętlenia wyników.IFS
wrócić do tego, co było wcześniej?Wolę używać tr zamiast sed, ponieważ sed ma w niektórych przypadkach problemy ze specjalnymi znakami, takimi jak \ r \ n.
innym rozwiązaniem jest ustawienie IFS na określony separator
źródło
Oto alternatywne rozwiązanie oparte na tr, które nie używa echa, wyrażone jako jednowierszowe.
Wydaje się bardziej uporządkowane bez echa, ale to tylko moje osobiste preferencje.
źródło
Spróbuj tego.
źródło
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
. Następnie zrób pętlę for w pętlę while. Możesz to zdobyć.Inne rozwiązanie nie wykorzystujące IFS i nadal zachowujące przestrzenie:
źródło
Oto moje czyste rozwiązanie bash, które nie zmienia IFS i może przyjmować niestandardowy separator wyrażeń regularnych.
źródło