2016-08-04 18 views
7

Mam bardzo długi ciąg do wydrukowania przez polecenie echo. Robiąc to, chcę, aby był idealnie wcięty. Próbuję to i to jest doskonale działa dobrzeJak uniknąć spacji w echo, gdy jest podzielony na wiele linii

echo "This is a very long string. An"\ 
"d it is printed in one line" 

Output: 
This is a very long string. And it is printed in one line 

Ale jak próbuję go wciąć prawidłowo jako echa oświadczenia jest także wcięte. Dodaje dodatkową przestrzeń.

echo "This is a very long string. An"\ 
    "d it is printed in one line" 

Output: 
This is a very long string. An d it is printed in one line 

Nie mogę znaleźć żadnej działającej odpowiedzi, która zrobi to doskonale.

Odpowiedz

5

Problem polega na tym, że dajesz dwa argumenty do echo, a jego domyślnym zachowaniem jest drukuje je z powrotem z przestrzeni pomiędzy:

$ echo "a"    "b" 
a b 
$ echo "a" "b" 
a b 
$ echo "a"\ 
>   "b" 
a b 

Jeśli chcesz mieć pełną kontrolę nad co drukujesz, używać tablic z printf:

lines=("This is a very long string. An" 
     "d it is printed in one line") 
printf "%s" "${lines[@]}" 
printf "\n" 

ten powróci:

This is a very long string. And it is printed in one line 

Albo jak suggested by 123 in comments użyć echo również z tablicy zachodzącego IFS na null:

# we define the same array $lines as above 

$ IFS="" 
$ echo "${lines[*]}" 
This is a very long string. And it is printed in one line 
$ unset IFS 
$ echo "${lines[*]}" 
This is a very long string. An d it is printed in one line 
#       ^
#        note the space 

Z Bash manual → 3.4.2. Special Parameters:

*

($ ) rozszerza się parametry pozycyjne, zaczynając od jednego. Gdy rozszerzenie nie mieści się w podwójnych cudzysłowach, każdy parametr pozycyjny rozwija się do osobnego słowa. W kontekstach, w których jest wykonywany, słowa te są przedmiotem dalszego dzielenia słów i rozwijania nazw plików. Gdy rozszerzenie występuje w podwójnych cudzysłowach, rozwija się do pojedynczego słowa z wartością każdego parametru oddzielonego pierwszym znakiem specjalnej zmiennej IFS. Oznacza to, że "$" jest równoważne "1c $ 2c ...", gdzie c jest pierwszym znakiem wartości zmiennej IFS. Jeśli IFS jest nieustawiony, parametry są oddzielone spacjami. Jeśli IFS ma wartość null, parametry są łączone bez interweniujących separatorów.

Interesujące czytanie: Why is printf better than echo?.

+0

Dzięki. Robię to. Tylko dla zapisu, czy możliwe jest użycie 'echo'? – molecule

+1

@molecule dobrze możesz zrobić coś jak 'dla linii w $ {lines [@]}"; zrobić; echo -n "$ line"; done'. Ale to jest trochę brzydkie, prawda? – fedorqui

+0

tak, naprawdę brzydko. Dzięki mate – molecule