Czytałem ten wątek: Jak zapętlić linie wiersza pliku?
Co to jest IFS
? A jakie jest jego użycie w kontekście for
pętli?
Czytałem ten wątek: Jak zapętlić linie wiersza pliku?
Co to jest IFS
? A jakie jest jego użycie w kontekście for
pętli?
IFS
oznacza - to znak, który oddziela pola. W opublikowanym przykładzie jest on ustawiony na znak nowej linii ( ); więc po ustawieniu przetworzy tekst wiersz po wierszu. W tym przykładzie możesz zmienić wartość (na jakąś literę, którą masz w pliku wejściowym) i sprawdzić, w jaki sposób tekst zostanie podzielony.Input
Internal Field Separator
\n
for
IFS
BTW, z opublikowanej odpowiedzi drugie rozwiązanie jest takie, które zaleca ...
Jak zauważył @jasonwryan , nie jest to Input
ale Internal
. Nazwa Input
pochodzi od tego, awk
w którym jest również OFS
- Output Field Separator
.
S
był dla separatora w powłoce Bourne'a, skąd pochodzi. W skorupie Korna i większości innych powłok podobnych do Bourne'a, jak to teraz określonoPOSIX
,S
dotyczy Delimitera (po prostu trochę rozciągnij swoją wyobraźnię), ponieważA::B:
na przykład jest podzielony na „A”, „” i „B” (bez dodatkowych „”). To różni się odawk
„sFS
lub zs
flagą ekspansji parametrzsh
.IFS
nie jest bezpośrednio związany z zapętlaniem, jest związany z dzieleniem słów.IFS
pośrednio określa, w jaki sposób dane wyjściowe polecenia są dzielone na części, nad którymi iteruje się pętla.W przypadku niezabezpieczonego podstawienia zmiennej
$foo
lub podstawienia polecenia$(foo)
występują dwa przypadki:"$foo"
lub w przypisaniu zmiennymx=$foo
, wówczas łańcuch wynikający z podstawienia jest używany jak jest.$IFS
jest traktowany jako separator słów. Na przykładIFS=":"; foo="12:34::78"; echo $foo
drukuje12 34 78
(z dwiema spacjami między34
i78
, ponieważ jest puste słowo).foo="*"; echo $foo
drukuje listę plików w bieżącym katalogu.Pętle, podobnie jak wiele innych kontekstów, oczekują listy słów. Więc
rozkłada się
$(foo)
na słowa i traktuje każde słowo jako wzór globalny. Domyślną wartościąIFS
jest spacja, tabulator i nowa linia , więc jeślifoo
drukuje dwie linie,hello world
ahowdy
następnie wykonuje się treść pętlix=hello
, tox=world
ix=howdy
. JeśliIFS
zostanie wyraźnie zmieniony, aby zawierał tylko nowy wiersz, wówczas pętla jest wykonywana dlahello world
ihowdy
. JeśliIFS
zmienia się byćo
, to pętla jest wykonywana nahell
, w
,rldh
(gdzie
jest znak nowej linii) iwdy
.źródło
"IFS indirectly determines how ..."
?IFS
(bezpośrednio) określa, w jaki sposób rozkłada się wynik podstawienia polecenia, co następnie (pośrednio) określa, przez co pętla przechodzi.Od
man bash
Jest to jedna ze zmiennych wewnętrznych Basha. Określa, w jaki sposób Bash rozpoznaje pola lub granice słów, gdy interpretuje ciągi znaków.
Domyślnie jest to spacja (spacja, tabulator i znak nowej linii), ale można go zmienić, na przykład, aby przeanalizować plik danych oddzielony przecinkami.
http://tldp.org/LDP/abs/html/internalvariables.html
źródło
Oprócz poprzednich świetnych odpowiedzi, dodam tylko, że IFS jest bardzo przydatny do wydajnego i przenośnego parsowania w prostych przypadkach w połączeniu z zestawem . Wydajny, ponieważ pozwala uniknąć używania podpowłok i narzędzi spawnujących, takich jak grep lub sed:
Pamiętaj tylko, że musimy przechowywać i odzyskiwać poprzednią wartość IFS, aby uniknąć niepożądanych awarii w innych częściach skryptu.
źródło