Używając powłoki bash w terminalu Mac OS X, chcę umieścić w zmiennej wszystkie nazwy plików w bieżącym katalogu, z jedną nazwą w wierszu (w zasadzie wynik ls -1). Jeśli jednak to zrobię:
var=$(ls -1)
echo $var
Zmienna "var" zawiera wszystkienazwy plików, ale w jednym wierszu, oddzielone spacjami. Jak mogę to naprawić i uzyskać to, czego chcę. Bardziej ogólnie, jaka jest przyczyna tego zachowania? Co się dzieje podczas rozbudowy ls -1?
Zdaję sobie sprawę, że mogę umieścić to, co chcę w pliku, wykonując następujące czynności, ale wolałbym osiągnąć ten sam wynik ze zmienną.
ls -1 > var
Z góry dziękuję.
Odpowiedzi:
3 dla odpowiedzi № 1Twoje polecenie var=$(ls -1)
działa w porządku. Próbować echo "$var"
(z podwójnymi cudzysłowami).
W echo $var
, bash czyta $var
i przekazywanie każdego słowa jako argumentu echo
. Traktuje spacje i linie tak samo. Używanie podwójnych cudzysłowów powoduje bash w leczeniu $var
jako pojedynczy argument, zamiast go ponownie formatować.
Jak wspomniano w mklement0, rozszerzenie $var
to się dzieje nazywa się dzielenie słów. Wyszukaj "dzielenie słów" w man bash
po więcej informacji. The IFS
zmienna (również w man bash
) kontroluje, jakie znaki bash używa do podziału na słowa.