2016-06-29 17 views
9

Mam ze mną zmienną FOO, która musi zostać przypisana z wartością, która będzie wieloma liniami. Coś takiego,Jak przypisać wartość wielowierszową do zmiennej bash

FOO="This is line 1 
    This is line 2 
    This is line 3" 

Więc kiedy drukować wartość FOO należy podać następujące dane wyjściowe.

echo $FOO 
output: 
This is line 1 
This is line 2 
This is line 3 

Ponadto liczba linii zostanie ustalona dynamicznie, ponieważ zainicjuję ją za pomocą pętli.

Odpowiedzi, które zostały pokazane w drugim pytaniu, używając głównie read -d, nie są odpowiednie dla mnie, ponieważ wykonuję intensywne operacje na ciągach i ważny jest również format kodu.

+2

usuwania początku odstępy w linii 2 i 3 oraz stosowania: 'echo "$ foo"' – Cyrus

Odpowiedz

22

Nie wcięcia linii lub dostaniesz dodatkowe spacje. Użyj cudzysłowów po rozwinięciu "$FOO", aby zapewnić zachowanie nowych linii.

$ FOO="This is line 1 
This is line 2 
This is line 3" 
$ echo "$FOO" 
This is line 1 
This is line 2 
This is line 3 

Innym sposobem jest użycie sekwencji ucieczkowych \n. Są interpretowane wewnątrz ciągów znaków $'...'.

$ FOO=$'This is line 1\nThis is line 2\nThis is line 3' 
$ echo "$FOO" 

Trzecim sposobem jest przechowywanie znaków \ i n, a następnie mieć echo -e interpretować sekwencje. To subtelna różnica. Ważną częścią jest to, że \n nie jest interpretowane wewnątrz zwykłych cytatów.

$ FOO='This is line 1\nThis is line 2\nThis is line 3' 
$ echo -e "$FOO" 
This is line 1 
This is line 2 
This is line 3 

Widać różnicę Robię jeśli usunąć opcję -e i mają echo drukować ciąg surowy bez interpretacji czegokolwiek.

$ echo "$FOO" 
This is line 1\nThis is line 2\nThis is line 3 
+0

Witaj John, twój przykładowy kod działa dla mnie! Jednak w pierwszym przykładzie powyżej, kiedy wywołuję echo zmiennej z '' 'echo $ FOO''' bez wstawiania $ FOO między znakami cudzysłowu, dane wyjściowe są w tej samej linii. Wiesz dlaczego? Używam GNU Bash, wersja 4.3.11 (1) - uruchom na Ubuntu 14.04. – yaobin

+0

To się dzieje, gdy nie masz ofert. Wartość podlega podziałowi na słowa * i * rozszerzeniu globu *. Zamiast "echo", które ma wydrukować jeden argument z osadzonymi znakami nowej linii, każde słowo '$ FOO' staje się oddzielnym argumentem bez żadnych znaków nowej linii. To tak jakbyś napisał 'echo To jest linia 1 To jest linia 2 To jest linia 3'. Konkluzja: zawsze cytuj zmienne rozszerzenia, chyba że chcesz, aby były poddane dzieleniu słów i globbingowi (rzadko). –

3

Po zainicjowaniu FOO należy użyć podziału linii: \n.

FOO="This is line 1\nThis is line 2\nThis is line 3" 

Następnie użyj echo -e do wyjścia FOO.

Ważne jest, aby pamiętać, że \n wewnątrz "..." NIE jest przerwa linia, ale dosłowne \, a następnie dosłownym n. Jest to tylko wtedy, gdy interpretowane przez echo -e, że ta literalna sekwencja jest konwertowana na znak nowego wiersza. - mądre słowa z mklement0


#!/bin/bash 

FOO="This is line 1\nThis is line 2\nThis is line 3" 
echo -e $FOO 

Output: 
This is line 1 
This is line 2 
This is line 3 
+0

Jego dając wyjście jako '-e Jest to linia 1 Jest to linia 2 Jest to linia 3' – juned

+0

Dzięki. Działa dla mnie. – molecule

+2

@juned Potrzebujesz wersji 'echo' która obsługuje' -e'. Wbudowane polecenie echa Basha działa podobnie jak plik binarny GNU '/ bin/echo'. –