Jestem zdezorientowany zakresem IFS, różne osoby wydają się myśleć, że jest on oparty na sesji w porównaniu ze skryptem po jego ustawieniu / zmianie.
Mój problem polega na tym, że przeczytałem chwilę, która ma potencjalnie puste kolumny, co kompensuje zmienne, w których je ustawiam. Jeśli zmienię ogranicznik w danych z karty i zaktualizuję IFS, aby używał tego nowego ogranicznika, obawiam się, że może to wpłynąć na inne polecenia odczytu w moim przepływie pracy.
Jeśli zrobię coś takiego:
while IFS='|' read var1 var2 var3
Czy to zmieni tylko wartość IFS dla tej konkretnej pętli while?
man bash
.Nie. Zmieni to tylko wartość IFS dla tego konkretnego
read
. Ogólnie pętla jest odwhile
dodone
, może zawierać wiele poleceń.Ani
IFS
nieread
są tutaj wyjątkowe. Weź ten ogólny kod:Wynik to:
Tylko sekunda
printenv
otrzymuje zmodyfikowaną wartość!Uwagi:
a
zmienną w bieżącej powłoce.printenv a
, nieecho $a
dlatego , że w tym drugim przypadku powłoka powiększyłaby$a
się do wartości widzianej przez samą powłokę jeszcze przed jejecho
uruchomieniem (niezależnie od tego, czyecho
jest ona wbudowana w powłokę, czy osobny plik wykonywalny). Składniavariable=foo some_command
rzadko zmienia zmienną dla samej powłoki (wyjątek jestvariable=foo export variable
). Gdybyś zmienił wszystkoprintenv a
naecho $a
w moim kodzie,0
dostałbyś all -s.źródło
Tak, zgodnie z blokiem kodu wartość IFS ustawiana jest tylko dla pętli. Gdy kontrola wyjdzie z pętli, IFS zyskuje na wartości przed wejściem do pętli. Nie wpłynie to na inne operacje odczytu w tym samym skrypcie powłoki. Próbowałem czegoś takiego:
Więc ustawiłem IFS na „|” przed pętlą. Wewnątrz pętli użyłem wartości IFS jako „,”. Gdy kontrola wyszła z pętli, wartość IFS wynosiła „|”.
źródło
read
”. Są miejsca wewnątrz pętli, którychIFS
nie ma,
. Zobacz moją odpowiedź.