Perché il mio script omette i primi spazi bianchi nell'output della console?


10

Ho il seguente script:

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

consoleWriteLine "    indented by 4 spaces"

Quando lo eseguo, ottengo il seguente output:

$ ./test.sh
indented by 4 spaces

Dove sono finiti i miei 4 spazi? E come posso riaverli?

Risposte:


22

Basta citare il echonella tua funzione:

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

echonota solo più argomenti separati da spazio e li stampa separati da un singolo spazio. Vedere:

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

Nell'ultimo esempio la stringa a b cè un singolo argomento echoed è così com'è.


La chiave per me capire qui era, citando l'argomento inizialmente si preserverà lo spazio bianco solo fino a quando non viene passato consoleWriteLine. La seconda volta echo, lo spazio bianco deve essere nuovamente conservato da virgolette aggiuntive. Non avrei mai immaginato che puoi mettere le virgolette in giro $*.
Der Hochstapler,

4
Non solo puoi mettere le virgolette in giro $*, la variante è $@stata appositamente creata per espandersi in parole separate quando citate: "$@"può essere diversi argomenti, "$*"è sempre solo uno. echoè uno dei pochi comandi in cui non fa differenza.
alexis,

4

Ho avuto questo problema da solo,

Secondo questo blog è necessario modificare l'IFS poiché, per impostazione predefinita, contiene spazi bianchi e quindi vede "xxx yyy zzzz" come 3 stringhe con spazi bianchi tra di loro.

IFS='\n'

prima del comando lo risolverà e deselezionerà IFS per rimuovere la modifica

unset IFS


2
funziona, ma la soluzione accettata (aggiunta di virgolette) è molto più ordinata.
Caesarsol,

Annuisco, non ho notato che non è stato citato. Ops! : D
djsmiley2kStaysInside
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.