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ć?

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.