Почему в моем сценарии пропущены первые пробелы в выводе консоли?

10

У меня есть следующий скрипт:

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

consoleWriteLine "    indented by 4 spaces"

Когда я запускаю его, я получаю следующий вывод:

$ ./test.sh
indented by 4 spaces

Куда делись мои 4 пробела? И как мне их вернуть?

Der Hochstapler
источник

Ответы:

22

Просто echoукажите в своей функции:

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

echoпросто замечает несколько аргументов, разделенных пробелом, и печатает их, разделенные одним пробелом. Увидеть:

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

В последнем примере строка a b cпредставляет собой один единственный аргумент и echoредактируется как есть.

хаос
источник
Ключ, который я должен был понять, заключался в том, что первоначальное цитирование аргумента будет сохранять только пробелы, пока они не будут переданы consoleWriteLine. Во второй раз, когда это echod, пробел должен быть снова сохранен дополнительными кавычками. Я бы никогда не догадался, что вы можете поместить цитаты вокруг $*.
Der Hochstapler
4
Вы можете не только заключать в кавычки $*, этот вариант $@был специально создан для того, чтобы раскрываться в отдельных словах в кавычках: "$@"может быть несколько аргументов, "$*"всегда только один. echoэто одна из немногих команд, где это не имеет значения.
Алексис
4

У меня была эта проблема,

Согласно этому блогу, вам нужно изменить IFS, так как по умолчанию он содержит пробелы и видит «xxx yyy zzzz» как 3 строки с пробелами между ними.

IFS='\n'

до того, как команда это исправит, и сбросьте IFS, чтобы удалить изменения

unset IFS

djsmiley2kStaysInside
источник
2
это работает, но принятое решение (добавление кавычек) намного аккуратнее.
Цезарсоль
Кивок, я не заметил, что это не было указано. Упс! : D
djsmiley2kStaysInside