Замена пустого символа не работает внутри скрипта
В сценарии оболочки я попытался заменить пустое пространство на \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и замену подстановки команды стандартным выводом команды с удалением любых завершающих строк новой строки.
Вот почему символы новой строки теряются.