Dlaczego mój skrypt pomija wiodące białe znaki w wynikach konsoli?

10

Mam następujący skrypt:

#!/bin/bash
function consoleWriteLine() {
  echo $* >&2
}

consoleWriteLine "    indented by 4 spaces"

Po uruchomieniu otrzymuję następujące dane wyjściowe:

$ ./test.sh
indented by 4 spaces

Gdzie poszły moje 4 miejsca? Jak mogę je odzyskać?

Der Hochstapler
źródło

Odpowiedzi:

22

Wystarczy podać echow swojej funkcji:

function consoleWriteLine() {
  echo "$*" >&2
}

echopo prostu zauważa wiele argumentów oddzielonych spacją i wypisuje je oddzielone pojedynczą spacją. Widzieć:

$ echo a b c
a b c
$ echo a b             c
a b c
$ echo "a b             c"
a b             c

W ostatnim przykładzie ciąg a b cjest jednym argumentem i jest echoedytowany bez zmian.

chaos
źródło
Kluczem do zrozumienia tutaj było, że zacytowanie argumentu na początku pozwoli zachować tylko białe znaki, dopóki nie zostaną przekazane consoleWriteLine. Po raz drugi to echobiałe znaki muszą zostać zachowane przez dodatkowe cytaty. Nigdy bym nie zgadł, że możesz wstawiać cytaty $*.
Der Hochstapler
4
Nie tylko możesz umieszczać cudzysłowy $*, wariant $@został stworzony specjalnie po to, by rozwinąć się w osobne słowa : "$@"może być kilka argumentów, "$*"zawsze jest tylko jeden. echojest jednym z niewielu poleceń, w którym nie ma znaczenia.
Alexis
4

Miałem sam ten problem,

Zgodnie z tym blogiem musisz zmienić IFS, ponieważ domyślnie zawiera on spację, a więc widzi „xxx yyy zzzz” jako 3 ciągi znaków z białą spacją między nimi.

IFS='\n'

przed poleceniem to naprawi i rozłączy IFS, aby usunąć zmianę

unset IFS

djsmiley2kStaysInside
źródło
2
to działa, ale przyjęte rozwiązanie (dodawanie cudzysłowów) jest znacznie starsze.
caesarsol
Nod, nie zauważyłem, że nie był cytowany. Ups! : D
djsmiley2kStaysInside