Замена пустого символа не работает внутри скрипта

В сценарии оболочки я попытался заменить пустое пространство на \n с помощью этой команды

echo -e $var |tr ' ' '\n'

За пределами скрипта он работал отлично, но внутри эффекта нет. Вот как я использую в сценарии:

var =$(echo -e $var | tr ' ' '\n' )

Благодарю.

2 ответа

Решение

После расширения параметра расширение ($var) или подстановка команды ($(cmd)), оболочка удаляет все пробелы из расширенного результата, чтобы разделить их на слова (разбиение по словам). Кроме того, он пытается сопоставить имена файлов для слов, которые содержат *, ? и / или [...] (расширение пути). Поэтому всегда заключайте расширения в двойные кавычки ("$var" а также "$(cmd)") чтобы избежать разбиения слов и расширения пути.

$ var=$'two\nlines   here'
$ echo $var
two lines here
$ echo "$var"
two
lines   here
$

Следовательно:

echo "$var" | tr ' ' '\n'
# or using bash's more powerful types of parameter expansions
echo "${var// /$'\n'}"

var="$(echo "$var" | tr ' ' '\n')"

Смотрите также: http://mywiki.wooledge.org/Quotes

Из руководства Bash (man bash):

Подстановка команд позволяет выводу команды заменить имя команды. Есть две формы:

$ (Команда)

или же

`command`

Bash выполняет расширение, выполнив command и замену подстановки команды стандартным выводом команды с удалением любых завершающих строк новой строки.

Вот почему символы новой строки теряются.

Другие вопросы по тегам