Myślałem, że następujące zgrupuje dane wyjściowe my_command
w tablicy wierszy:
IFS='\n' array_of_lines=$(my_command);
tak $array_of_lines[1]
by odnosiło się do pierwszego wiersza na wyjściu my_command
, $array_of_lines[2]
do drugiego i tak dalej.
Jednak powyższe polecenie wydaje się nie działać dobrze. Wydaje się, że dzieli także wynik my_command
wokół znaku n
, jak już sprawdziłem print -l $array_of_lines
, co, jak sądzę, drukuje elementy tablicy linia po linii. Sprawdziłem to również za pomocą:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
W drugiej próbie pomyślałem, że dodanie eval
może pomóc:
IFS='\n' array_of_lines=$(eval my_command);
ale mam dokładnie taki sam wynik jak bez niego.
Wreszcie, podążając za odpowiedzią dotyczącą elementów List ze spacjami w zsh , próbowałem również użyć flag rozwijania parametrów zamiast IFS
powiedzieć zsh, jak podzielić dane wejściowe i zebrać elementy w tablicę, tj .:
array_of_lines=("${(@f)$(my_command)}");
Ale nadal mam ten sam wynik (dzielenie się dzieje n
)
W związku z tym mam następujące pytania:
Pytanie 1 Jakie są „właściwe” sposoby gromadzenia danych wyjściowych polecenia w szeregu wierszy?
Q2 Jak mogę określić IFS
podział tylko na nowe wiersze?
Pytanie 3 Jeśli użyję flag rozszerzania parametrów, jak w mojej trzeciej próbie powyżej (tj. Przy użyciu @f
), aby określić podział, czy zsh ignoruje wartość IFS
? Dlaczego to nie zadziałało powyżej?
źródło
"${(@f)...}"
jest taki sam jak${(f)"..."}
, ale w inny sposób.(@)
wewnątrz podwójnych cudzysłowów oznacza „wydaj jedno słowo na element tablicy” i(f)
„podziel się na tablicę znakiem nowej linii”. PS: Proszę zamieścić link do dokumentacji${(f)"..."}
pomija puste linie,"${(@f)...}"
zachowuje je. To jest to samo rozróżnienie między$argv
i"$argv[@]"
. Ta"$@"
rzecz polegająca na zachowaniu wszystkich elementów tablicy pochodzi z powłoki Bourne'a pod koniec lat 70.Dwa problemy: po pierwsze, najwyraźniej podwójne cudzysłowy również nie interpretują znaków ukośnika odwrotnego (przepraszam za to :). Użyj
$'...'
cytatów. I zgodnie z tymman zshparam
, aby zebrać słowa w tablicy, musisz zawrzeć je w nawiasach. To działa:Nie mogę odpowiedzieć na twoje pytanie 3. Mam nadzieję, że nigdy nie będę musiał wiedzieć tak ezoterycznych rzeczy :).
źródło
Możesz także użyć tr, aby zastąpić znak nowej linii spacją:
źródło
$IFS
. Tłumaczenie jednego na drugi nie ma znaczenia.echo
, gdzie wkładem są mniej więcej stosy słów oddzielone tym, kogo to obchodzi.