Команда tr не действует при использовании в $ () и сохранении в переменной

Процитирую мой собственный пост из Мета :

Ссылки на страницы руководства

У меня уже есть предпочтительный метод для этого , о котором вы можете прочитать на странице руководства less в двух местах:

LESS='+/\+cmd' man less

и

LESS='+/LESS[[:space:]]*Options' man less

(Видите, что я там делал?)

2
23.10.2016, 22:45
2 ответа

Проблема не в tr , проблема заключается в том, как вы выводите расширение переменной:

echo $PAGE_LINKS

Цитируйте переменную раскрытие:

echo "$PAGE_LINKS"

в противном случае расширение будет проходить через разделение слов в соответствии со значением IFS (пробел, табуляция, новая строка по умолчанию) и раскрытие имени пути ( * , ? , []).

В вашем случае происходит разделение слов, и каждый элемент, разделенный новой строкой, берется индивидуально и, наконец, отображается как объекты, разделенные пробелом. Использование кавычек предотвратит разделение слов (и расширение имени пути), поэтому все расширение будет считаться единым целым.

4
29.04.2021, 00:08

Согласно странице руководства bash для конструкции $ (command) :

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

Итак, tr - это не проблема, а bash либо удаляет символы новой строки, если они завершаются, либо удаляет любые другие символы новой строки во время разделения слов. Это поведение, как задокументировано.

Я считаю, что вы хотите такого поведения в большинстве мест. Если у вас есть файл со списком имен файлов в нем, то:

for FILENAME in $(cat somefile)
do
     ...
done

Итерация по списку имен файлов. Вы не хотите, чтобы символы новой строки в somefile испортили ваш список слов, используемых в качестве имен файлов, и, возможно, даже испортили цикл for-do-done.

5
29.04.2021, 00:08

Теги

Похожие вопросы