2012-01-03 4 views
8

Piszę skrypt w bashu i chcę, aby wykonał polecenie i osobno obsłużył każdą linię. na przykład:umieść wieloliniowe wyjście wewnątrz zmiennej

LINES=$(df) 
echo $LINES 

spowoduje zwrócenie całego wyjścia konwertującego nowe wiersze spacjami.

przykład:

jeśli wyjście miało być:

1 
2 
3 

to chciałbym dostać

1 2 3 

jak mogę umieścić dane wyjściowe polecenia w zmiennej umożliwiając nowy linie nadal są nowymi liniami, więc kiedy wydrukuję zmienną i otrzymam poprawne wyniki?

Odpowiedz

11

Ogólnie w bash $v prosi o problemy w większości przypadków. Prawie zawsze, co naprawdę masz na myśli, to "$v" w podwójnym cudzysłowie.

LINES="`df`"  # double-quote + backtick 
echo "$LINES" 
OLDPATH="$PATH" 
+6

W rzeczywistości ani przypisanie do zmiennych potrzebnych ofert, ponieważ wynikiem rozszerzenia nie jest podział słów podczas przypisywania do zmiennej. Ale nic nie boli i łatwiej jest trenować pamięć mięśniową, aby wpisać podwójne cytaty wokół wszystkich ekspansji. –

+0

Dobrze wiedzieć, dzięki! – kubanczyk

6

Nie, nie będzie. $(something) usuwa jedynie nowe znaki końcowe.

Rozszerzenie argumentu do echa dzieli się na białe znaki, a następnie echo łączy oddzielne argumenty z spacją. Aby zachować odstępy, trzeba zacytować ponownie:

echo "$LINES" 

uwaga, że ​​przypisanie robi nie muszą być notowane; wynikiem ekspansji nie jest podział słów na przypisanie do zmiennej i argument w stosunku do case. Ale może być cytowany i łatwiej jest po prostu nauczyć się zawsze umieszczać cytaty.

+0

Czy jesteś pewien? Mam oczekiwane wyniki tylko z 'LINES = $ (df); echo "$ {LINES}" ', być może IFS jest inny w naszym środowisku. Wciąż +1 jako '$ (df)' jest lepsze niż pojedyncze cytaty w odpowiedzi @ kubańczyka – nhed

+0

@ ned, dlaczego lepsze? – kubanczyk

+0

@ nhed: Right ... przypisanie do zmiennej nigdy nie dzieli. Byłem zdezorientowany komunikatem o błędzie, który okazał się pochodzić z czegoś innego, kiedy testowałem to tutaj. –